GameTech/URP 渲染实战
源码 / Ch29/BatcherBreaker.shader
Ch29/BatcherBreaker.shader
// 案例 29.1 的反例:能编译、能显示,但 SRP Batcher 不兼容。
// 原因:_BaseColor 声明在 CBUFFER 之外,变成了“全局 uniform”,每个材质都要单独 SetPass 上传。
// 在 Inspector 里选中这个 Shader,会看到 SRP Batcher: not compatible 及原因。
Shader "Cookbook/Ch29/BatcherBreaker"
{
    Properties
    {
        [MainColor] _BaseColor ("Color", Color) = (1, 1, 1, 1)
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" "RenderPipeline"="UniversalPipeline" "Queue"="Geometry" }
        Pass
        {
            Tags { "LightMode"="UniversalForward" }
            HLSLPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"

            half4 _BaseColor;     // ✗ 不在 UnityPerMaterial 里

            struct Attributes { float4 positionOS : POSITION; };
            struct Varyings { float4 positionCS : SV_POSITION; };
            Varyings vert(Attributes input) { Varyings o; o.positionCS = TransformObjectToHClip(input.positionOS.xyz); return o; }
            half4 frag(Varyings i) : SV_Target { return _BaseColor; }
            ENDHLSL
        }
    }
}