Quick answer: Open the Material. Inspector reports the precise reason (usually a property declared as Global rather than per-material). In Shader Graph, set the property’s Override Property Declaration to Hybrid Per Instance → UnityPerMaterial, or remove the global flag. SRP Batcher: compatible.
URP, Shader Graph, three properties. Material inspector says “SRP Batcher: not compatible.” Frame Debugger shows your draw calls broken into one per renderer. The Shader Graph default of throwing color/scalar overrides into a global CBUFFER kills batching.
The Symptom
Material inspector states “SRP Batcher: not compatible.” Reason listed underneath. Frame Debugger shows separate draw calls per material instance even though the material is identical across renderers.
What Causes This
SRP Batcher requires every per-material constant to live in a single CBUFFER named UnityPerMaterial, with a known layout the batcher can patch quickly between draws. Properties declared as Global, or types Shader Graph doesn’t put in the CBUFFER, break the contract.
The Fix
Step 1: Read the inspector reason. The Material inspector explicitly states why batching failed. Common reasons:
- “Material property X is missing from CBUFFER” — property is global.
- “Material property X has unsupported type” — rare.
- “Shader uses a sampler in CBUFFER” — samplers aren’t allowed inline.
Step 2: Per-material properties stay in UnityPerMaterial. In Shader Graph, click each property. Inspector pane → Override Property Declaration → UnityPerMaterial (or leave default Hybrid Per Instance for DOTS).
Float, Vector, Color, Matrix — all fine in CBUFFER. Texture references stay outside (textures are sampler binds, not constants).
Step 3: Globals stay global. If a property is set globally via Shader.SetGlobalFloat (wind speed, time-of-day, world fog), set Override Property Declaration to Global on it. The batcher then ignores it for per-material packing.
Inspecting the Generated CBUFFER
In Shader Graph, right-click the master node → Show Generated Code. Search for CBUFFER_START(UnityPerMaterial). Every per-material property should appear inside; globals outside.
DOTS / Hybrid Renderer
For Entities Graphics, properties marked Hybrid Per Instance are exposed to the BatchRendererGroup. Use this for properties that vary per entity but you still want batched. Same idea, different bucket.
Verifying
Inspector now reads “SRP Batcher: compatible.” Frame Debugger collapses many draw calls into one batched draw. Stats overlay shows lower SetPass calls.
“Per-material in UnityPerMaterial. Globals declared global. Batcher loves you.”
Related Issues
For shaders not updating in build, see build shader updates. For Time node frozen, see Time node.
CBUFFER right. Batcher batches.