GameTech/URP 渲染实战
源码 / Ch29/OverdrawCount.shader
Ch29/OverdrawCount.shader
// 案例 29.5:Overdraw 计数。作为 overrideMaterial 替换场景里所有物体的材质,
// 每画一层片元就往 R 通道加 1(加法混合),最后得到“每个像素被着色了几次”。
Shader "Cookbook/Ch29/OverdrawCount"
{
    Properties
    {
        [Enum(UnityEngine.Rendering.CompareFunction)] _ZTest ("ZTest", Float) = 8   // 8 = Always:统计所有光栅化出的片元
        [Enum(UnityEngine.Rendering.CullMode)] _Cull ("Cull", Float) = 2
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" "RenderPipeline"="UniversalPipeline" }
        Pass
        {
            Name "Count"
            Blend One One          // 累加
            ZWrite Off
            ZTest [_ZTest]
            Cull [_Cull]
            HLSLPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #pragma multi_compile_instancing
            #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"

            struct Attributes { float4 positionOS : POSITION; UNITY_VERTEX_INPUT_INSTANCE_ID };
            struct Varyings { float4 positionCS : SV_POSITION; };

            Varyings vert(Attributes input)
            {
                Varyings o;
                UNITY_SETUP_INSTANCE_ID(input);
                o.positionCS = TransformObjectToHClip(input.positionOS.xyz);
                return o;
            }
            half4 frag(Varyings i) : SV_Target { return half4(1, 0, 0, 0); }
            ENDHLSL
        }
    }
}