Unity中URP下的SimpleLit顶点着色器

文章目录

  • 前言
  • 顶点着色器
    • 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、顶点输入数据相关

在这里插入图片描述

  1. VertexPositionInputs:存储 顶点 在不同坐标系下的坐标信息
    在这里插入图片描述

  2. VertexNormalInputs:存储 法线 相关信息
    在这里插入图片描述

  3. GetVertexPositionInputs:把顶点本地坐标转化为(世界、观察、齐次裁剪、NDC)坐标系下
    在这里插入图片描述

  4. GetVertexNormalInputs:得到法线相关数据
    该函数有两种方法重载,按是否已知切线来使用
    若切线未知,则以假设的方式得到切线
    在这里插入图片描述

3、雾效混合因子

在这里插入图片描述

4、对 uv 进行 Tilling 和 Offset 的应用 及 把顶点的坐标信息传给输出结构体

在这里插入图片描述

5、把法线相关的结果,传给输出结构体

  • viewDirWS:被Unity分类到了这里。但是,这是计算世界空间下的视线向量。
    在这里插入图片描述

6、光照贴图相关

在这里插入图片描述

7、额外灯相关计算

在这里插入图片描述

  • VertexLighting
    在这里插入图片描述

8、阴影相关

在这里插入图片描述