源码 / Ch03/C03_06_SRPBatcher.shader
Ch03/C03_06_SRPBatcher.shader
// 第 6 步:把材质属性放进 UnityPerMaterial 常量缓冲区,让 Shader 兼容 SRP Batcher。 Shader "Cookbook/Ch03/SRPBatcher" { Properties { [MainTexture] _BaseMap ("Base Map", 2D) = "white" {} [MainColor] _BaseColor ("Base Color", Color) = (1, 1, 1, 1) _Cutoff ("Alpha Cutoff", Range(0, 1)) = 0.5 [Enum(UnityEngine.Rendering.CullMode)] _Cull ("Cull", Float) = 2 } SubShader { Tags { "RenderType"="TransparentCutout" "RenderPipeline"="UniversalPipeline" "Queue"="AlphaTest" } // HLSLINCLUDE 里的代码会被自动拼到本 SubShader 每个 Pass 的 HLSLPROGRAM 前面。 // 把 CBUFFER 写在这里,所有 Pass 的 UnityPerMaterial 布局天然一致。 HLSLINCLUDE #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" CBUFFER_START(UnityPerMaterial) float4 _BaseMap_ST; half4 _BaseColor; half _Cutoff; CBUFFER_END // 纹理和采样器不是“数值”,不能也不需要放进 CBUFFER TEXTURE2D(_BaseMap); SAMPLER(sampler_BaseMap); ENDHLSL Pass { Name "Unlit" Tags { "LightMode"="UniversalForward" } Cull [_Cull] HLSLPROGRAM #pragma vertex vert #pragma fragment frag #pragma multi_compile_fog struct Attributes { float4 positionOS : POSITION; float2 uv : TEXCOORD0; half4 color : COLOR; }; struct Varyings { float4 positionCS : SV_POSITION; float2 uv : TEXCOORD0; half4 color : COLOR; float fogFactor : TEXCOORD1; }; Varyings vert (Attributes input) { Varyings output; output.positionCS = TransformObjectToHClip(input.positionOS.xyz); output.uv = TRANSFORM_TEX(input.uv, _BaseMap); output.color = input.color; output.fogFactor = ComputeFogFactor(output.positionCS.z); return output; } half4 frag (Varyings input) : SV_Target { half4 col = SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, input.uv) * _BaseColor * input.color; clip(col.a - _Cutoff); col.rgb = MixFog(col.rgb, input.fogFactor); return half4(col.rgb, 1); } ENDHLSL } } }