Quick answer: Set FadeScreenSize on the DecalComponent. Add DecalLifetimeOpacity node in the decal material, multiplied with Opacity output — otherwise the engine fade flag has no visual effect.

A first-person shooter places hundreds of bullet hole decals over a level. They’re still visible at long range, costing performance. Setting FadeScreenSize seems to do nothing.

Why FadeScreenSize Alone Isn't Enough

FadeScreenSize tells the engine when to start hiding the decal (based on screen size). But the actual fade is driven by the material’s opacity. If your material has Opacity = 1.0 (constant), it’s either fully on or fully off — pop-out instead of fade.

Add DecalLifetimeOpacity in the Material

In the decal material editor:

  1. Add the DecalLifetimeOpacity node.
  2. Multiply it with your existing opacity value.
  3. Plug the result into the Opacity input.

This node outputs 1 when fully visible, 0 when fully faded. It picks up FadeScreenSize, FadeStartDelay, FadeDuration, and FadeInDuration.

DecalComponent Settings

DecalComponent->SetFadeScreenSize(0.005f);   // fade below 0.5% screen size
DecalComponent->SetFadeOut(10.0f, 2.0f, true);   // 10s lifetime, 2s fade

SetFadeOut starts a timed fade, useful for blood/bullet decals. SetFadeScreenSize handles distance-based fade.

Performance Win

Decals are deferred — even tiny ones cost full-rect overdraw for the decal’s bounding box. Hundreds of small far decals can saturate the GPU. FadeScreenSize culls them once below threshold; with the material fade, they disappear gracefully.

Verifying

Place a row of decals receding into distance. Camera moves back: nearest decals stay sharp, distant ones fade out smoothly. Profile GPU — deferred decal pass cost drops as you move away.

“FadeScreenSize is the trigger; DecalLifetimeOpacity in the material is the actor. Both are needed.”

For dense decal scenes (battlefield, urban combat), this fade saves 1–3ms GPU time on console. Set up base decal materials with DecalLifetimeOpacity by default.