Quick answer: Add the Decal Renderer Feature to your URP renderer asset, set Technique = Screen Space, enable Decal Layers in URP and on the projector, and turn on Receive Decals on the SkinnedMeshRenderer. All four required.

A blood splat decal looks great on the floor. Move it onto an enemy and nothing renders. Decals on skinned meshes need explicit opt-in across the URP pipeline, the projector, and the renderer.

The Symptom

DecalProjector renders fine on static geometry. Skinned mesh receivers (characters, enemies) show no decal where the projector overlaps them.

The Required Configuration

1. Decal Renderer Feature on the URP renderer. ProjectSettings → Graphics → URP Asset → Renderer → Add Renderer Feature → Decal. Without this, decals do not render at all in URP.

2. Technique = Screen Space. The Decal Renderer Feature has a Technique dropdown. DBuffer works only with the Deferred path (URP 2022+). Screen Space works with both Forward and Deferred and is the default for skinned mesh support.

3. Decal Layers enabled. URP Asset → Lighting → Decal Layers checkbox. This adds a 32-bit decal layer mask to every renderer. Without it, projector layer settings are ignored and you might still hit silent skips.

4. Receive Decals on the SkinnedMeshRenderer. The SkinnedMeshRenderer Inspector has a Receive Decals checkbox under Additional Settings. Tick it on every character that should accept decals.

Layer Masks

DecalProjector → Decal Layer Mask: a 32-bit dropdown of named layers (Default, plus user-named ones). The receiver’s Rendering Layer Mask must share at least one bit. Both default to “Everything” on creation, so the most common bug is naming layers and forgetting to update one of the two ends.

DecalProjector:
  Decal Layer Mask:        EnemyBlood
  Material:                M_BloodSplatter
  Size:                    (2, 2, 2)

SkinnedMeshRenderer (Enemy):
  Receive Decals:          true
  Rendering Layer Mask:    EnemyBlood, Default

Spawning Bullet Hole Decals on Hit

public class DecalSpawner : MonoBehaviour
{
    public GameObject decalPrefab;

    public void SpawnAt(RaycastHit hit)
    {
        var proj = Instantiate(decalPrefab, hit.point, Quaternion.LookRotation(-hit.normal));

        if (hit.transform.GetComponentInParent<Animator>())
            proj.transform.SetParent(hit.collider.transform, true);
    }
}

Parenting under the hit collider keeps the decal moving with the bone, so it tracks animations without needing the screen-space projection to recompute every frame.

HDRP Differences

HDRP has its own Decal Projector with its own Material requirements. The same checks apply: Receive Decals on the renderer, layer mask matched, Decal Projector volume set up. HDRP also has Surface Type and Affect BaseColor / Normal / Mask toggles per material.

Verifying

Frame Debugger (Window → Analysis → Frame Debugger). Step into the rendering of the character. There should be a Draw Decals pass that includes your projector. If absent, the renderer feature is missing or the layer mask excludes you.

“Renderer feature. Screen Space technique. Decal layers on. Receive Decals on the renderer. Layer masks aligned.”

Related Issues

For decals invisible at distance, see decal distance fade. For Volume effects ignored, see Volume not applying.

Renderer feature. Screen Space. Receive Decals. Decals land.