GameTech/URP 渲染实战
源码 / shaders/Ch03/C03_03_VertexColor.glsl
shaders/Ch03/C03_03_VertexColor.glsl
// 第 3 步:读取网格的顶点色,和贴图、颜色相乘。
Shader "Cookbook/Ch03/VertexColor"
{
    SubShader
    {
        Tags { "RenderType"="Opaque" "RenderPipeline"="UniversalPipeline" "Queue"="Geometry" }

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

            GLSLPROGRAM
            // 顶点输入 color:顶点色 Mesh.colors,没有顶点色的网格读到 (1,1,1,1)
            VARYING vec2 uv;
            VARYING vec4 vColor;      // 光栅化时在三角形内部线性插值

            uniform sampler2D _BaseMap;
            uniform vec4  _BaseMap_ST;
            uniform vec4  _BaseColor;
            uniform float _VertexColorStrength;

            #ifdef VERTEX
            void main()
            {
                gl_Position = TransformObjectToHClip(positionOS.xyz);
                uv = TransformTex(texcoord0.xy, _BaseMap_ST);
                vColor = color;     // 原样传下去,插值交给硬件
            }
            #endif

            #ifdef FRAGMENT
            void main()
            {
                vec4 tex = texture(_BaseMap, uv);
                // lerp(1, 顶点色, 强度):强度为 0 时乘以白色,等于不起作用
                vec4 vc = mix(vec4(1, 1, 1, 1), vColor, _VertexColorStrength);
                fragColor = tex * _BaseColor * vc;
            }
            #endif
            ENDGLSL
        }
    }
}