Back to course overview

Part 5: INDIRECT LIGHTING

⏱️ ~22 min📑 3 sections

What you'll learn:

  • How light bounces between surfaces (global illumination)
  • How Lumen calculates indirect lighting in real-time
  • Emissive materials and how they contribute light

Section 13: Indirect Lighting & Lumen (8 min)

🖼️Image placeholder: Indirect Lighting with Lumen

To see how indirect lighting (bounce light) works, we need reference materials that demonstrate the effect:

BP_LHT_RefLightingIndirect Blueprint: Create a Blueprint with spheres showing HSV Value effects on bounce:

  1. White (V = 0.85) — High bounce, brightens nearby surfaces
  2. Mid Grey (V = 0.5) — Medium bounce
  3. Dark Grey (V = 0.18) — Low bounce
  4. Black (V = 0.04) — Minimal bounce, absorbs most light

Add a white wall or floor nearby to see how each sphere's color bleeds onto adjacent surfaces.

Direct lighting: Light travels from source → surface → camera
Indirect lighting: Light bounces off surfaces before reaching camera

Indirect light is why:

  • Shadows aren't pure black (light bounces into them)
  • Rooms feel "filled" even with one window
  • Colors bleed between nearby surfaces

Base Color (also called Albedo) represents reflectance — what percentage of light bounces back. This is the Value in HSV (Hue, Saturation, Value).

Here's why this matters for indirect lighting:

The Value (brightness) of your materials determines how much light bounces.

Material ValueBounce Behavior
0.1 (dark)Absorbs 90% of light, only 10% bounces
0.5 (mid)Absorbs 50%, bounces 50%
0.8 (bright)Absorbs 20%, bounces 80%
1.0 (white)Absorbs nothing, 100% bounces forever

This is why realistic material values matter:

  • Too-dark materials = dead, flat shadows (no bounce)
  • Too-bright materials = washed out, no contrast (infinite bounce)
  • Correct values (0.04 - 0.85) = natural light falloff

Practical example:

  • A room with dark walls (0.1 Value) will have very little bounce light — shadows will be harsh
  • The same room with light walls (0.7 Value) will have soft, filled shadows from all the bounced light

Lumen is Unreal Engine 5's Global Illumination (GI) system.

What Lumen Does:

  • Calculates light bouncing between surfaces
  • Provides ambient fill in shadows
  • Makes emissive materials "light" the scene
  • Updates dynamically as lights/objects move

Lumen uses different ray tracing methods to gather indirect lighting information:

MethodHow It WorksBest For
Screen TracingTraces against screen-space data (what's visible)Fast, default fallback
Hardware Ray TracingUses RTX/DXR hardware to trace actual geometryHighest accuracy, requires RT GPU
Software Ray Tracing (Distance Fields)Uses pre-computed mesh distance fieldsWorks without RT hardware, handles global scale

Note: Distance Fields work when Hardware RT is off — they're Lumen's fallback for indirect lighting on non-RTX hardware.

Screen traces use the rendered image to approximate indirect lighting. This is fast but has limitations:

Screen Tracing Source — What data screen traces use:

Project Settings → Rendering → Lumen → Screen Tracing Source

SourceDescription
SceneStandard scene color
Scene Color with TranslucencyIncludes translucent surfaces (best option for accuracy)

Post Process Controls:

SettingLocationWhat It Does
Screen TracesPost Process → Lumen GI → Screen TracesOn/Off toggle for screen-space contribution
Final Gather QualityPost Process → Lumen GIIncrease sample count for GI (performance hit)
Lumen Scene Lighting QualityPost Process → Lumen GIImprove lighting representation fidelity
Lumen Scene DetailPost Process → Lumen GIImprove geometry representation fidelity

Important: Screen traces are view-dependent — if you look away from a surface, it can't contribute to GI via screen traces. Hardware RT and Distance Fields provide more stable results.

For highest accuracy, enable Hit Lighting mode:

Project Settings → Rendering → Lumen → Ray Lighting Mode → Hit Lighting

This uses hardware ray tracing to evaluate lighting at each ray hit rather than using the surface cache.

Note: Hit Lighting is more expensive but produces more accurate results, especially for complex lighting scenarios.

  1. Create an enclosed room with a window opening
  2. Add a single light outside the window — convert this setup into a Blueprint for reuse. This gives you a portable indirect lighting test rig you can drop into any level.
  3. Lumen OFF: Interior is black except direct light path
  4. Lumen ON: Light bounces inside, fills the room

Quick toggle via Project Settings:

Project Settings > Engine > Rendering > Global Illumination:
    Dynamic Global Illumination Method: Lumen / None

Each light has an Indirect Lighting Intensity property:

  • 1.0 = Normal bounce contribution
  • 0.0 = This light doesn't contribute to bounces
  • 1.0 = Exaggerated bounce (artistic choice)

See Part 6: Exposure for Lumen quality settings and Post Process overrides.


Section 14: Emissive Materials (6 min)

An emissive material appears to glow — it outputs light values greater than 1.0.

Creating an Emissive Material:

  1. Create new material
  2. Add Emissive Color input
  3. Multiply base color by intensity value
Emissive Color = Light Color × Intensity
Example: Orange × 100 = Bright orange glow
ValueResult
0 - 1No visible glow
1 - 10Subtle glow
10 - 100Noticeable brightness
100+Intense, like looking at light source

By itself: NO.
Emissive materials appear bright but don't cast light on other objects.

With Lumen: YES.
Lumen can make emissive surfaces contribute to indirect lighting.

Demonstration:

  1. Hide all lights
  2. Place emissive material in scene
  3. Lumen OFF: Only the material glows, surroundings are black
  4. Lumen ON: Emissive casts colored light on nearby surfaces

Emissive lighting via Lumen has the same issues as other indirect lighting:

  • Noisy
  • Inconsistent frame-to-frame
  • Not reliable when consistency matters

Why Emissive Can Be Noisy:

  • Mesh size and emissive intensity — Small meshes with high intensity are harder to sample accurately
  • Related to Screen Traces — Screen-space limitations affect emissive contribution
  • Sample count — Default sampling may not be enough for complex emissive setups

Solutions:

  • Reduce intensity of emissive and increase exposure instead
  • Use larger emissive surfaces rather than small bright ones
  • Add support lights (actual light actors) near emissive surfaces for consistent results
  • Increase Final Gather Quality (performance cost)

Don't rely on emissive as primary lighting when you need predictable, repeatable results.


Section 15: Lumen Quality & Noise Control (8 min)

Lumen uses temporal accumulation — it builds quality over multiple frames. Noise appears when:

  • Camera or objects move quickly
  • Lighting changes rapidly
  • Sample counts are too low

These console variables control Lumen's spatial filtering and denoising:

Console VariableDefaultWhat It Does
r.Lumen.ScreenProbeGather.SpatialFilterNumPasses3Number of spatial filter passes — increase to smooth noisy samples spatially
r.Lumen.ScreenProbeGather.SpatialFilterHalfKernelSize1Kernel size — increase to widen the filter for stronger denoising

Temporal Stability Settings:

SettingLocationWhat It Does
Lumen Scene Lighting Update SpeedPost Process → Lumen GIHow fast lighting updates (lower = more stable, slower response)
Final Gather Lighting Update SpeedPost Process → Lumen GIHow fast final gather updates (lower = more stable)

Trade-off: Reducing update speed makes lighting more stable but slower to respond to changes. For cinematics, slower speeds reduce noise; for gameplay, faster speeds keep lighting responsive.

  1. Start with default settings — Often good enough
  2. If noisy: Increase SpatialFilterNumPasses to 5-6
  3. If still noisy: Increase SpatialFilterHalfKernelSize to 2
  4. For cinematics: Reduce update speeds in Post Process settings
  5. For problem emissives: Add support lights or reduce emissive intensity