Quick answer: Standard decals only project onto opaque surfaces during the GBuffer pass. Translucent materials render later and ignore decals. Either make the receiving material Opaque (with shader-side refraction for glassy look), or place a hidden decal-receiver plane underneath the translucent surface.

Here is how to fix Unreal DecalComponents that show up on every solid surface but go missing the moment you try to project them onto glass, water, or any other translucent material. The decal is correctly placed, the bounding box overlaps the surface, but the surface renders unaffected. The deferred renderer’s decal pass simply does not see translucent geometry.

The Symptom

A DecalComponent works on walls, floors, and characters. Aim it at a window, an aquarium, or a puddle — nothing. The decal projects past the translucent surface onto whatever opaque geometry is behind it (the wall behind the window, the pool floor under the water).

What Causes This

Translucent rendering happens after decals. The deferred decal pass runs against GBuffer data, which contains only opaque geometry. Translucent materials are forward-rendered later and decals never reach them.

Surface material domain wrong. If the surface material’s Blend Mode is Translucent or Additive, it cannot participate in the deferred decal pass.

Decal Blend Mode incompatible. Some decal blend modes only target specific GBuffer channels. A Stain decal on a non-base-color surface contributes nothing visible.

Receives Decals flag off. Each Primitive Component has a Receives Decals checkbox. If unchecked, no decals project on it regardless of material.

The Fix

Step 1: Confirm Receives Decals is on. Select the surface mesh in the level. In Details, under Rendering, ensure Receives Decals is checked.

Step 2: For glass-like surfaces, use Opaque + refraction. Open the surface material. Set Blend Mode to Opaque. In the shader graph, multiply BaseColor by 0.05 (mostly invisible) and add Refraction via the Refraction input on the master node. The result looks like glass but participates in the GBuffer.

// Glass-like material wired up:
BaseColor    = small dark tint
Metallic     = 0
Roughness    = 0.1
Specular     = 1
Refraction   = IoR-based refraction node
Blend Mode   = Opaque  (allows decals)

Step 3: For water, place a receiver plane. Below your water surface, place an invisible plane with an opaque material that captures decals. Set its visibility for shadows and decals only:

StaticMeshComponent (DecalReceiver):
    bRenderInMainPass = false
    bReceivesDecals = true
    bAffectIndirectLightingWhileHidden = false
    bRenderInDepthPass = false

This object exists just to catch decals. Players cannot see it directly, but the decals it receives become visible through the translucent water on top.

Step 4: Pick the right Decal Blend Mode. For full-color projections (blood, paint), use Translucent. For only normals (raised emboss), use Normal. For only darkening (dirt, scorch), use Stain. The blend mode determines which GBuffer channels the decal writes to.

Step 5: For surfaces that must be true translucent, use a forward decal mesh. Skip DecalComponent entirely; use a flat StaticMeshActor with a translucent material that resembles the decal art. It renders at the same depth as the translucent surface and looks like a decal. Less efficient but works on water/glass.

Sort Order For Overlapping Decals

If multiple decals overlap, set Sort Order on the DecalComponent. Higher values render last (on top). Useful when blood splatter and footstep decals stack at the same spot — usually footsteps below blood.

“Decals are a deferred opaque feature. Translucent surfaces ignore them. Make the surface opaque or fake the decal with a flat mesh.”

Related Issues

For URP decal issues, see URP Decal On Skinned Mesh. For other Unreal rendering issues, see Niagara Not Rendering in PIE.

Opaque + refraction for glass. Hidden receiver plane for water. Sort Order for stacks.