GameTech/URP 渲染实战
源码 / Ch03/C03_03_VertexColor.shader
Ch03/C03_03_VertexColor.shader
// 第 3 步:读取网格的顶点色,和贴图、颜色相乘。
Shader "Cookbook/Ch03/VertexColor"
{
    Properties
    {
        [MainTexture] _BaseMap ("Base Map", 2D) = "white" {}
        [MainColor]   _BaseColor ("Base Color", Color) = (1, 1, 1, 1)
        // 0 = 忽略顶点色,1 = 完全使用;做成滑条方便对比
        _VertexColorStrength ("Vertex Color Strength", Range(0, 1)) = 1
    }

    SubShader
    {
        Tags { "RenderType"="Opaque" "RenderPipeline"="UniversalPipeline" "Queue"="Geometry" }

        Pass
        {
            Name "Unlit"
            Tags { "LightMode"="UniversalForward" }

            HLSLPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"

            struct Attributes
            {
                float4 positionOS : POSITION;
                float2 uv         : TEXCOORD0;
                half4  color      : COLOR;      // 顶点色:Mesh.colors,没有顶点色的网格读到 (1,1,1,1)
            };

            struct Varyings
            {
                float4 positionCS : SV_POSITION;
                float2 uv         : TEXCOORD0;
                half4  color      : COLOR;      // 光栅化时在三角形内部线性插值
            };

            TEXTURE2D(_BaseMap);
            SAMPLER(sampler_BaseMap);
            float4 _BaseMap_ST;
            half4  _BaseColor;
            half   _VertexColorStrength;

            Varyings vert (Attributes input)
            {
                Varyings output;
                output.positionCS = TransformObjectToHClip(input.positionOS.xyz);
                output.uv = TRANSFORM_TEX(input.uv, _BaseMap);
                output.color = input.color;     // 原样传下去,插值交给硬件
                return output;
            }

            half4 frag (Varyings input) : SV_Target
            {
                half4 tex = SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, input.uv);
                // lerp(1, 顶点色, 强度):强度为 0 时乘以白色,等于不起作用
                half4 vc = lerp(half4(1, 1, 1, 1), input.color, _VertexColorStrength);
                return tex * _BaseColor * vc;
            }
            ENDHLSL
        }
    }
}