GameTech/URP 渲染实战
源码 / shaders/Ch03/C03_04_AlphaClip.glsl
shaders/Ch03/C03_04_AlphaClip.glsl
// 第 4 步:透明度裁剪(Alpha Clip / Alpha Test)。alpha 低于阈值的像素直接丢弃。
Shader "Cookbook/Ch03/AlphaClip"
{
    SubShader
    {
        // AlphaTest 队列(2450)排在普通不透明物体之后,RenderType 让替换着色/工具识别它
        Tags { "RenderType"="TransparentCutout" "RenderPipeline"="UniversalPipeline" "Queue"="AlphaTest" }

        Pass
        {
            Name "Unlit"
            Tags { "LightMode"="UniversalForward" }
            Cull [_Cull]                         // 渲染状态可以引用属性,用方括号

            GLSLPROGRAM
            VARYING vec2 uv;
            VARYING vec4 vColor;

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

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

            #ifdef FRAGMENT
            void main()
            {
                vec4 col = texture(_BaseMap, uv) * _BaseColor * vColor;
                // clip(x):x < 0 时丢弃当前片元,不写颜色也不写深度。GLSL 里写成 discard
                if (col.a - _Cutoff < 0.0) discard;
                fragColor = vec4(col.rgb, 1);        // 不透明物体输出 alpha=1
            }
            #endif
            ENDGLSL
        }
    }
}