文章目录
- 前言
- 顶点着色器
-
- 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) shader Varyings 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; #else half fogFactor = ComputeFogFactor(vertexInput.positionCS.z); #endif output.uv = TRANSFORM_TEX(input.texcoord, _BaseMap); output.positionWS.xyz = vertexInput.positionWS; output.positionCS = vertexInput.positionCS; #ifdef _NORMALMAP half3 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); #else output.normalWS = NormalizeNormalPerVertex(normalInput.normalWS); #endif OUTPUT_LIGHTMAP_UV(input.staticLightmapUV, unity_LightmapST, output.staticLightmapUV); #ifdef DYNAMICLIGHTMAP_ON output.dynamicLightmapUV = input.dynamicLightmapUV.xy * unity_DynamicLightmapST.xy + unity_DynamicLightmapST.zw; #endif OUTPUT_SH(output.normalWS.xyz, output.vertexSH); #ifdef _ADDITIONAL_LIGHTS_VERTEX half3 vertexLight = VertexLighting(vertexInput.positionWS, normalInput.normalWS); output.fogFactorAndVertexLight = half4(fogFactor, vertexLight); #else output.fogFactor = fogFactor; #endif #if defined(REQUIRES_VERTEX_SHADOW_COORD_INTERPOLATOR) output.shadowCoord = GetShadowCoord(vertexInput); #endif return output; }
1、GPU Instance 相关
2、顶点输入数据相关
-
VertexPositionInputs:存储 顶点 在不同坐标系下的坐标信息
-
VertexNormalInputs:存储 法线 相关信息
-
GetVertexPositionInputs:把顶点本地坐标转化为(世界、观察、齐次裁剪、NDC)坐标系下
-
GetVertexNormalInputs:得到法线相关数据
该函数有两种方法重载,按是否已知切线来使用
若切线未知,则以假设的方式得到切线
3、雾效混合因子
4、对 uv 进行 Tilling 和 Offset 的应用 及 把顶点的坐标信息传给输出结构体
5、把法线相关的结果,传给输出结构体
- viewDirWS:被Unity分类到了这里。但是,这是计算世界空间下的视线向量。
6、光照贴图相关
7、额外灯相关计算
- VertexLighting