文章目录
- 前言
- 顶点着色器
- 1、GPU Instance 相关
- 2、顶点输入数据相关
- 3、雾效混合因子
- 4、对 uv 进行 Tilling 和 Offset 的应用 及 把顶点的坐标信息传给输出结构体
- 5、把法线相关的结果,传给输出结构体
- 6、光照贴图相关
- 7、额外灯相关计算
- 8、阴影相关
前言
在上一篇文章中,我们了解了URP下SimpleLit的整体框架。
- Unity中URP下 SimpleLit框架
我们在这篇文章中,来了解一下URP下SimpleLit中,光照核心部分的顶点着色器干了什么,方便之后我们自定义自己的光照Shader。
因为被Unity封装的原因。所以,顶点着色器 和 片元着色器 主要是在这两个文件中。
顶点着色器
- 我们来依次分析一下顶点着色器内实现了什么。
// Used in Standard (Simple Lighting) shaderVaryings LitPassVertexSimple(Attributes input){Varyings output = (Varyings)0;UNITY_SETUP_INSTANCE_ID(input);UNITY_TRANSFER_INSTANCE_ID(input, output);UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);VertexPositionInputs vertexInput = GetVertexPositionInputs(input.positionOS.xyz);VertexNormalInputs normalInput = GetVertexNormalInputs(input.normalOS, input.tangentOS);#if defined(_FOG_FRAGMENT)half fogFactor = 0;#elsehalf fogFactor = ComputeFogFactor(vertexInput.positionCS.z);#endifoutput.uv = TRANSFORM_TEX(input.texcoord, _BaseMap);output.positionWS.xyz = vertexInput.positionWS;output.positionCS = vertexInput.positionCS;#ifdef _NORMALMAPhalf3 viewDirWS = GetWorldSpaceViewDir(vertexInput.positionWS);output.normalWS = half4(normalInput.normalWS, viewDirWS.x);output.tangentWS = half4(normalInput.tangentWS, viewDirWS.y);output.bitangentWS = half4(normalInput.bitangentWS, viewDirWS.z);#elseoutput.normalWS = NormalizeNormalPerVertex(normalInput.normalWS);#endifOUTPUT_LIGHTMAP_UV(input.staticLightmapUV, unity_LightmapST, output.staticLightmapUV);#ifdef DYNAMICLIGHTMAP_ONoutput.dynamicLightmapUV = input.dynamicLightmapUV.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw;#endifOUTPUT_SH(output.normalWS.xyz, output.vertexSH);#ifdef _ADDITIONAL_LIGHTS_VERTEXhalf3 vertexLight = VertexLighting(vertexInput.positionWS, normalInput.normalWS);output.fogFactorAndVertexLight = half4(fogFactor, vertexLight);#elseoutput.fogFactor = fogFactor;#endif#if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR)output.shadowCoord = GetShadowCoord(vertexInput);#endifreturn output;}
1、GPU Instance 相关
2、顶点输入数据相关
-
VertexPositionInputs:存储 顶点 在不同坐标系下的坐标信息
-
VertexNormalInputs:存储 法线 相关信息
-
GetVertexPositionInputs:把顶点本地坐标转化为(世界、观察、齐次裁剪、NDC)坐标系下
-
GetVertexNormalInputs:得到法线相关数据
该函数有两种方法重载,按是否已知切线来使用
若切线未知,则以假设的方式得到切线
3、雾效混合因子
4、对 uv 进行 Tilling 和 Offset 的应用 及 把顶点的坐标信息传给输出结构体
5、把法线相关的结果,传给输出结构体
- viewDirWS:被Unity分类到了这里。但是,这是计算世界空间下的视线向量。
6、光照贴图相关
7、额外灯相关计算
- VertexLighting