Quick answer: The DecalProjector component does nothing on its own — you must add the Decal Renderer Feature to the URP Renderer asset that your camera uses. After that, check the projector’s Scale Depth, confirm the gizmo box intersects the target surface, match Decal Layers between projector and MeshRenderer, and pick DBuffer if you need proper normal blending.
You drop a DecalProjector onto your blood-splatter GameObject, assign a material, hit Play, and … nothing. The yellow gizmo box is sitting right on top of the wall but no decal appears. This is the most common URP decal issue and it is almost always the same five culprits. Let’s walk through each of them in the order Unity actually checks them.
The Symptom
A DecalProjector has a valid material assigned. The yellow projection box is visible in the Scene view and clearly overlaps a mesh. In Game view and during Play, no decal is drawn on the surface. There are no errors in the Console. Toggling the projector on and off does nothing visible.
Sometimes it works in Scene view but not Game view. Sometimes it renders on one camera but not another. Sometimes it shows up when you first open the scene and then vanishes after entering Play mode.
What Causes This
1. Missing Decal Renderer Feature. URP uses a feature-based architecture. The DecalProjector component only stores data — the actual rendering is done by a Renderer Feature that must be added manually to the Universal Renderer Data asset. A fresh URP project does not include it by default.
2. Wrong renderer is active. Your project may have multiple Renderer Data assets (Forward, Deferred, 2D). The Decal Feature might be on one but not the one your camera uses.
3. Technique mismatch. URP offers Screen Space and DBuffer techniques. Screen Space is cheaper but cannot write into normals and breaks on transparent surfaces. If you want decals to affect smoothness or normal maps, you need DBuffer, which requires specific feature support.
4. Scale Depth too small. The DecalProjector is an oriented box. Only geometry inside that box receives the decal. If Scale Depth is 1 but the surface is 1.2 units below the projector origin, the decal never touches anything.
5. Decal Layers disabled or mismatched. URP’s 2022+ versions support Decal Layers similar to Light Layers. Both the URP Asset and the receiving MeshRenderer must have the layer enabled for the decal to project.
The Fix
Step 1: Add the Decal Renderer Feature. Select your Universal Renderer Data asset (usually named UniversalRenderer or similar), click Add Renderer Feature, and pick Decal. This single step fixes roughly 70% of reported cases.
// Programmatic check: list features on the active renderer
using UnityEngine.Rendering.Universal;
var urp = (UniversalRenderPipelineAsset)GraphicsSettings.defaultRenderPipeline;
var renderer = urp.GetRenderer(0) as UniversalRenderer;
foreach (var feature in renderer.rendererFeatures) {
Debug.Log(feature.GetType().Name);
// Expect to see: DecalRendererFeature
}
Step 2: Configure the Technique. In the Decal Renderer Feature inspector, switch Technique from Automatic to DBuffer if you see compatibility warnings or need proper normal blending. DBuffer requires at least DBuffer Color & Normal & Mask depending on what your decal material writes.
// DecalProjector material must match the technique:
// - Screen Space technique → Shader Graph with "Decal" target
// and Surface: Opaque, Affects: Base Color only
// - DBuffer technique → Shader Graph with "Decal" target
// and Affects: Base Color + Normal + MAOS (as needed)
Step 3: Fix Scale Depth and placement. The projector draws decals only on surfaces inside its box. A flat wall decal needs just a small depth; a blood splatter on uneven terrain needs more. Orient the projector so the local -Z axis faces the surface and size the box to comfortably envelop it.
using UnityEngine.Rendering.Universal;
public class DecalSpawner : MonoBehaviour {
public Material decalMaterial;
public void SpawnAt(Vector3 point, Vector3 surfaceNormal) {
var go = new GameObject("Decal");
go.transform.position = point + surfaceNormal * 0.5f;
go.transform.rotation = Quaternion.LookRotation(-surfaceNormal);
var projector = go.AddComponent<DecalProjector>();
projector.material = decalMaterial;
projector.size = new Vector3(1f, 1f, 2f); // deep enough!
projector.pivot = new Vector3(0, 0, 1f); // place origin at front
projector.fadeFactor = 1f;
projector.drawDistance = 50f;
}
}
Step 4: Match Decal Layers. If you enabled Decal Layers in the URP Asset (under Rendering), every receiver must opt in.
// URP Asset → Rendering → Decal Layers: checked
// DecalProjector → Decal Layer: Layer 1
// MeshRenderer → Additional Settings → Decal Layer: Layer 1
// If either side has Decal Layer: Nothing, the decal will not show.
Step 5: Rule out transparent surfaces. URP decals (both techniques) do not project onto transparent materials. If the wall uses a Lit Transparent shader, switch it to Opaque or use Alpha Clip instead.
Step 6: Verify camera post-processing does not hide it. Bloom with excessive threshold, or a custom render pass inserted after opaque but before transparent, can overwrite decal output. Temporarily disable post-processing on the camera to isolate.
Why This Works
URP is a scriptable render pipeline. Unlike the Built-in pipeline where features were always-on, URP only does work when a Renderer Feature tells it to. The DecalProjector component is just a data container — it holds the material, size, and layer info, but it never directly issues a draw call. The DecalRendererFeature reads every DecalProjector in the scene, culls by distance and layer, and injects the appropriate render passes.
The DBuffer technique writes decal attributes into a separate set of buffers before opaque geometry is shaded, so the GPU can sample those buffers when shading each pixel. This is why DBuffer can affect normals and smoothness — it participates in the actual lighting calculation. Screen Space runs after opaque rendering and just overlays color, which is cheaper but loses that depth of blending.
Decal Layers mirror Light Layers: they let you scope which geometry a decal can affect without paying for per-object culling in the material. The layer check is a cheap bitmask test done in the fragment shader.
"If you can see the gizmo but not the decal, it is almost always a missing Renderer Feature. Check that first, then technique, then depth and layers."
Related Issues
If your URP shaders compile but render pink, see Fix: Unity URP Pink Materials After Upgrade. For custom Renderer Features that run but have no visible effect, check Fix: Unity URP Custom Renderer Feature Not Running.
Add the Decal Renderer Feature before anything else — the component is just data.