文章目录
- 前言
- 顶点着色器
- 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