GameTech/URP 渲染实战
源码 / shaders/Ch03/C03_06_SRPBatcher.glsl
shaders/Ch03/C03_06_SRPBatcher.glsl
// 第 6 步:把材质属性放进 UnityPerMaterial 常量缓冲区,让 Shader 兼容 SRP Batcher。
// (GLSL 版)WebGL 没有 CBUFFER,材质属性就是普通 uniform;结构照 HLSL 版保留,方便对照。
Shader "Cookbook/Ch03/SRPBatcher"
{
    SubShader
    {
        Tags { "RenderType"="TransparentCutout" "RenderPipeline"="UniversalPipeline" "Queue"="AlphaTest" }

        // GLSLINCLUDE(对应 HLSLINCLUDE)里的代码会被自动拼到本 SubShader 每个 Pass 的 GLSLPROGRAM 前面。
        // 把 CBUFFER 写在这里,所有 Pass 的 UnityPerMaterial 布局天然一致。
        GLSLINCLUDE
        // CBUFFER_START(UnityPerMaterial)
        uniform vec4  _BaseMap_ST;
        uniform vec4  _BaseColor;
        uniform float _Cutoff;
        // CBUFFER_END

        // 纹理和采样器不是“数值”,不能也不需要放进 CBUFFER
        uniform sampler2D _BaseMap;
        ENDGLSL

        Pass
        {
            Name "Unlit"
            Tags { "LightMode"="UniversalForward" }
            Cull [_Cull]

            GLSLPROGRAM
            #pragma multi_compile_fog

            VARYING vec2 uv;
            VARYING vec4 vColor;
            VARYING float fogFactor;

            #ifdef VERTEX
            void main()
            {
                gl_Position = TransformObjectToHClip(positionOS.xyz);
                uv = TransformTex(texcoord0.xy, _BaseMap_ST);
                vColor = color;
                fogFactor = ComputeFogFactor(gl_Position.z);
            }
            #endif

            #ifdef FRAGMENT
            void main()
            {
                vec4 col = texture(_BaseMap, uv) * _BaseColor * vColor;
                if (col.a - _Cutoff < 0.0) discard;
                col.rgb = MixFog(col.rgb, fogFactor);
                fragColor = vec4(col.rgb, 1);
            }
            #endif
            ENDGLSL
        }
    }
}