Quick answer: URP’s default Decal Technique is Screen Space, which does not affect skinned meshes. Switch the Decal Renderer Feature’s Technique to DBuffer in your URP Renderer Data. Make sure the URP Asset has Depth Texture enabled.

Here is how to fix Unity URP Decal Projectors that show up on terrain and static meshes but completely skip your skinned-mesh characters. Blood splatter on the ground? Yes. Blood on the player? Nothing. The cause is the Decal Renderer Feature’s Technique setting — Screen Space mode, the default, only writes to opaque static geometry.

The Symptom

A DecalProjector looking down at a character renders the decal on the floor below them but not on their body. The same projector works on every static mesh nearby. SkinnedMeshRenderer is unaffected.

What Causes This

Screen Space technique skips skinned meshes. Screen Space decals are accumulated post-opaque, and the URP implementation chose to skip skinned meshes for performance reasons in older versions.

DBuffer technique not enabled. The DBuffer (Decal Buffer) technique writes decal data into intermediate buffers during the GBuffer pass, which all opaque renderers (including skinned) consume. It must be selected explicitly.

Depth texture missing. DBuffer requires the camera depth texture. Without it enabled in the URP Asset, DBuffer cannot reconstruct surface positions to project onto.

Decal Layer mask wrong. The DecalProjector has a Decal Layer mask. The renderer it should affect must include the same layer in its Decal Layer Mask. A bit-mask mismatch silently filters the decal.

The Fix

Step 1: Add the Decal Renderer Feature. Find your URP Renderer Data asset. In the inspector, click Add Renderer Feature and pick Decal.

Step 2: Set Technique to DBuffer. On the Decal feature, set Technique to DBuffer. Set Surface Data to Albedo Normal MAOS for the most flexible projection.

Step 3: Enable Depth Texture. Open the URP Asset. Under General, enable Depth Texture. DBuffer reads it.

Step 4: Match decal layers. On the DecalProjector, set its Decal Layer to (for example) Decal Layer 1. On the SkinnedMeshRenderer’s Renderer component, set Rendering Layer Mask to include Decal Layer 1. Both must overlap.

using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.Rendering.Universal;

public class DecalSetup : MonoBehaviour
{
    [SerializeField] private SkinnedMeshRenderer body;

    void Awake()
    {
        // Decal Layer 1 (bit 1)
        body.renderingLayerMask |= (uint)(1 << 1);
    }
}

Step 5: For decals attached to moving characters, parent to bones. A world-space DecalProjector projects from a static world location. As the character animates, the decal “slides” across the deforming mesh. To stick a wound to a specific body part, parent the projector to the relevant bone:

var chest = body.GetBone(HumanBodyBones.Chest);
decalProjector.transform.SetParent(chest, false);
decalProjector.transform.localPosition = Vector3.zero;

Performance Note

DBuffer is more expensive than Screen Space — it adds an extra GBuffer-time pass. For mobile, you may need to limit DBuffer to certain cameras (cinematic only) and use Screen Space for ambient world decals on static geometry. Configure two URP Renderer Data assets and switch via camera Renderer index.

Verifying The Setup

Frame Debugger after the change should show a Render DBuffer pass before the opaque pass and DBuffer Sample calls during opaque rendering. The decal’s color and normal should appear in the buffer overlay. If you see no DBuffer pass, the feature is not enabled or Depth Texture is off.

“Screen Space decals are fast and skinned-mesh-blind. DBuffer is slower and universal. Pick the technique that matches the surface you target.”

Related Issues

For URP feature execution issues, see URP Render Graph Pass. For URP decal projector visibility, see URP Decal Projector Not Showing.

DBuffer technique. Depth Texture on. Layer masks match. Skinned meshes accept the decal.