Unity中URP下的SimpleLit顶点着色器


前言

在上一篇文章中,我们了解了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、阴影相关

在这里插入图片描述

相关推荐

最近更新

  1. TCP协议是安全的吗?

    2024-01-19 21:46:01       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-19 21:46:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-19 21:46:01       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-19 21:46:01       20 阅读

热门阅读

  1. SQL注入常用命令详解

    2024-01-19 21:46:01       23 阅读
  2. GoLang刷题之leetcode

    2024-01-19 21:46:01       41 阅读
  3. 【go】依赖倒置demo

    2024-01-19 21:46:01       38 阅读
  4. 网络安全产品之认识入侵检测系统

    2024-01-19 21:46:01       31 阅读
  5. 对docker的一些粗略理解

    2024-01-19 21:46:01       33 阅读
  6. 免费chartGPT网站汇总--

    2024-01-19 21:46:01       28 阅读
  7. Kafka系列(三)

    2024-01-19 21:46:01       30 阅读
  8. Python之归并排序

    2024-01-19 21:46:01       31 阅读
  9. Mysql的in与exits

    2024-01-19 21:46:01       32 阅读
  10. git相关

    2024-01-19 21:46:01       32 阅读