GameTech/URP 渲染实战
源码 / shaders/Ch23/ShadowDebug.glsl
shaders/Ch23/ShadowDebug.glsl
// 本章的调试 Shader(GLSL 版):
//   _Mode = 0:按 ComputeCascadeIndex 给每一级级联上色(红/绿/蓝/黄,超出阴影距离为灰)
//   _Mode = 1:只输出主光阴影衰减(白 = 受光,黑 = 阴影),用来观察屏幕空间阴影贴图等
Shader "Cookbook/Ch23/ShadowDebug"
{
    SubShader
    {
        Tags { "RenderType"="Opaque" "RenderPipeline"="UniversalPipeline" "Queue"="Geometry" }
        Pass
        {
            Name "ForwardLit"
            Tags { "LightMode"="UniversalForward" }
            GLSLPROGRAM
            uniform float _Mode;
            uniform float _Tint;

            VARYING vec3 positionWS;
            VARYING vec3 normalWS;

            #ifdef VERTEX
            void main()
            {
                VertexPositionInputs p = GetVertexPositionInputs(positionOS.xyz);
                gl_Position = p.positionCS; positionWS = p.positionWS;
                normalWS = TransformObjectToWorldNormal(normalOS);
            }
            #endif

            #ifdef FRAGMENT
            vec4 frag()
            {
                vec4 shadowCoord = TransformWorldToShadowCoord(positionWS);
                float shadow = MainLightRealtimeShadow(shadowCoord);
                if (_Mode > 0.5) return vec4(vec3(shadow), 1);

                vec3 n = normalize(normalWS);
                Light l = GetMainLight();
                vec3 shade = vec3(saturate(dot(n, l.direction)) * shadow * 0.8 + 0.25);
                // _MAIN_LIGHT_SHADOWS_CASCADE 关键字在网页版是个 uniform(级联数 > 1 时为 1)
                float cascade = _MainLightShadowsCascade > 0.5 ? ComputeCascadeIndex(positionWS) : 0.0;   // 0..3,超出所有级联球为 4
                vec3 kColors[5] = vec3[5](
                    vec3(1.0, 0.35, 0.3), vec3(0.35, 0.9, 0.4), vec3(0.35, 0.55, 1.0),
                    vec3(1.0, 0.85, 0.3), vec3(0.6, 0.6, 0.6)
                );
                vec3 tint = mix(vec3(1, 1, 1), kColors[int(cascade)], _Tint);
                return vec4(shade * tint, 1);
            }
            void main() { fragColor = frag(); }
            #endif
            ENDGLSL
        }
        Pass
        {
            Name "ShadowCaster"
            Tags { "LightMode"="ShadowCaster" }
            ZWrite On ZTest LEqual ColorMask 0
            GLSLPROGRAM
            #define CH23_SHADOW_PASS
            #include "Ch23/Ch23Common.glsl"
            ENDGLSL
        }
        Pass
        {
            Name "DepthOnly"
            Tags { "LightMode"="DepthOnly" }
            ZWrite On ColorMask R
            GLSLPROGRAM
            #define CH23_DEPTH_PASS
            #include "Ch23/Ch23Common.glsl"
            ENDGLSL
        }
    }
}