The 3D Handbook
Topic

Real-time lighting

How game engines light a scene every frame, the four light types, physical light units and falloff, how many lights you can afford in Unreal, Unity and Godot, and when to bend physics for gameplay.

lightingrenderingunrealunitygodot

Real-time lighting is lighting that the engine calculates while the game runs, every frame, instead of storing it in textures ahead of time. Unity's manual describes the trade-off: real-time lights are "not baked into lightmaps", and "their runtime cost can be high, depending on the complexity of the scene" (Unity Manual: Light Modes).

The same trade-off applies throughout this chapter. Real-time light can move, change colour and react to a player who knocks down a wall. Baked light is cheap to draw but frozen. Most games mix the two; see baked vs. dynamic lighting. This page covers the parts every engine shares: light types, units, falloff, light budgets and when to depart from physical accuracy. For the art side of light, read light and shadow first.

#Direct and indirect light

Every lit pixel gets light in two ways.

  • Direct light travels straight from a light to the surface. Shadows are places where direct light is blocked.
  • Indirect light has bounced off other surfaces first. Godot's documentation explains that indirect diffuse light comes from light bouncing off surfaces and from emissive materials (Godot Engine documentation: Introduction to global illumination).

Direct light is cheap to compute in real time. Indirect light is harder, and the techniques that handle it are called global illumination. When people say a game has "fully dynamic lighting" in 2026, they usually mean the indirect light is real-time too, as with Unreal's Lumen.

Two views of the same dark room lit by a spot light pointing at the floor. On the left, labelled No fake GI, only a bright pool on the floor is visible and the walls and ceiling are black. On the right, labelled With fake GI, the walls and ceiling are dimly lit.
Direct light only (left): the spot light lights the floor and the rest of the room "remains entirely dark". On the right, a shadowless, low-energy omni light placed between the spot light and the floor fakes the bounce. Screenshot from Godot.Godot Engine documentation (Juan Linietsky, Ariel Manzur and the Godot community), CC BY 3.0

#The four light types

Engines offer the same small set of light types under different names. Godot 4 has DirectionalLight3D, OmniLight3D, SpotLight3D and AreaLight3D (Godot Engine documentation: 3D lights and shadows). Unreal's Lumen supports Directional, Sky, Point, Spot and Rect lights (Unreal Engine Documentation: Lumen Global Illumination and Reflections).

Four panels. Directional shows parallel slanted arrows. Point shows arrows radiating from a dot. Spot shows a cone of arrows from a dot. Rect shows arrows leaving a flat rectangle.
The four common light types. A sky light is a fifth kind in most engines: light arriving from the whole sky dome rather than from one source.Diagram by the handbook author
  • Directional: parallel rays from an infinitely distant source. Use it for the sun and moon. Position does not matter, only angle.
  • Point (Godot: omni): light in all directions from one spot. Bulbs, candles, fires.
  • Spot: a cone. Torches, street lamps, stage lights.
  • Rect or area: light from a surface. Windows, light panels, TV screens. Softer and more expensive.
A dark teal scene with a cone and a torus on a checkered floor. A glowing rectangular area light hangs above them, casting a soft rectangular pool of light on the floor and soft-edged shadows.
An area light in Godot. Its shadows use a variable penumbra, controlled by the light's Size property; the documentation notes this can be demanding. Screenshot from Godot.Godot Engine documentation (Juan Linietsky, Ariel Manzur and the Godot community), CC BY 3.0

#Units and falloff

Older engines used "unitless" brightness numbers that only meant something relative to each other. Modern engines can use physical units, which makes it easier to match real places and to share values between scenes.

Unreal's documentation lists the units (Unreal Engine Documentation: Using Physical Lighting Units):

Light Unit What it measures
Directional Lux Illuminance: "one lumen per squared meter"
Point, Spot, Rect Candela or Lumen (or Unitless) Intensity in a direction, or total light output
Sky light, emissive materials cd/m² Luminance of a surface

Epic also gives conversions for old scenes: "1 cd = 625 unitless" (Unreal Engine Documentation: Using Physical Lighting Units).

Falloff. Light from a point source spreads over a growing sphere, so it weakens with the square of the distance. Unreal calls its option "Inverse Squared Falloff", described as "physically based distance falloff" (Unreal Engine Documentation: Using Physical Lighting Units).

A line chart of brightness against distance from 1 to 8 metres. Brightness is 100 percent at 1 metre, 25 percent at 2 metres, 6.25 percent at 4 metres and 1.6 percent at 8 metres.
Inverse-square falloff, computed for this page. A lamp that lights a desk well at 1 m gives a quarter of that light at 2 m and a sixteenth at 4 m.Diagram by the handbook author
Two renders of the same omni light above a floor with two boards, a monkey head and a sphere. Each has a small curve graph in the corner. In the top render the curve drops steeply and the light forms a small pool; in the bottom render the curve stays high for longer and the light spreads much further.
Godot's omni light does not use pure inverse-square falloff: it adds a Range and an attenuation curve so lights can stop at a set radius. The inset curves show two attenuation settings and how far the light reaches with each. Screenshot from Godot.Godot Engine documentation (Juan Linietsky, Ariel Manzur and the Godot community), CC BY 3.0

Physical units only work with sensible exposure. Real light levels differ enormously: full sun is about EV 15, a home interior EV 5 to 7 (Wikipedia: Exposure value). If you place a physically bright light and the image goes white, Epic's advice is that "the auto exposure range may be too limited" (Unreal Engine Documentation: Using Physical Lighting Units). See exposure and post-processing.

For the shape of a light's beam (the scallops of a wall washer, a window pattern on the floor), see IES profiles and light functions.

#How many lights can you afford?

Every engine has hard and soft limits. Knowing them early avoids a clean-up pass later.

Engine and renderer Limit Source
Godot 4, Forward+ Default of 512 "clustered elements" in the camera view (Godot Engine documentation)
Godot 4, Mobile 8 omni + 8 spot lights per mesh; 256 + 256 in view (Godot Engine documentation)
Godot 4, Compatibility 8 omni + 8 spot lights per mesh (Godot Engine documentation)
Godot 4, all renderers Up to 8 directional lights visible; up to 88 shadowed lights in view with the default atlas layout (Godot Engine documentation)
Unity URP A per-object limit for additional lights, ignored on the Forward+ path (Universal RP 17 documentation)
Unreal, Stationary lights "Only four or fewer" may overlap; beyond that, a light falls back to costly dynamic shadows (Unreal Engine Documentation)

Shadows usually cost more than the lights themselves. A point light without shadows is cheap; the same light casting shadows renders the scene again into a shadow map. Godot's default shadow map size is 4096, which it suggests keeping "in most cases" (Godot Engine documentation: 3D lights and shadows). For how shadows are stored and why Unreal moved to virtual shadow maps, see shadows and virtual shadow maps.

#Departing from physical accuracy

Physically based lighting gives a correct starting point. Games also have to be readable: players need to see enemies, doors and paths.

#In different engines

Unreal Engine 5 Unity 6 (URP/HDRP) Godot 4
Light types Directional, Sky, Point, Spot, Rect (Unreal Engine Documentation) Each light is set to Realtime, Mixed or Baked mode (Unity Manual) DirectionalLight3D, OmniLight3D, SpotLight3D, AreaLight3D (Godot Engine documentation)
Units Lux, candela, lumen, cd/m², or unitless (Unreal Engine Documentation) Exposure handled in EV100 in HDRP (see exposure and post-processing) Physical camera attributes optional (see exposure and post-processing)
Real-time indirect light Lumen, the default GI and reflections system (Unreal Engine Documentation) Enlighten realtime GI, plus probe systems (see global illumination) SDFGI, VoxelGI, SSIL (Forward+ only) (Godot Engine documentation)
Light limits Stationary overlap of four (Unreal Engine Documentation) Per-object limit outside Forward+ (Universal RP 17 documentation) 512 clustered elements in Forward+ (Godot Engine documentation)

#Common mistakes

This page pairs with exercise: lighting one scene four ways, which asks you to light one scene four ways.

#Further reading and watching

References

  1. Unity Technologies · Light Modes (introduction) · Unity Manual, 2026 · docs · accessed 2026-10-21
  2. Godot Engine contributors · Introduction to global illumination · Godot Engine documentation (source on GitHub), 2026 · docs · accessed 2026-10-21
  3. Godot Engine contributors · 3D lights and shadows · Godot Engine documentation (source on GitHub), 2026 · docs · accessed 2026-10-21
  4. Epic Games · Lumen Global Illumination and Reflections · Unreal Engine Documentation, 2026 · docs · accessed 2026-10-21
  5. Epic Games · Using Physical Lighting Units · Unreal Engine Documentation, 2026 · docs · accessed 2026-10-21
  6. Wikipedia contributors · Exposure value · Wikipedia, 2026 · web · accessed 2026-10-21
  7. Unity Technologies · Universal Render Pipeline Asset · Universal RP 17 documentation, 2026 · docs · accessed 2026-10-21
  8. Epic Games · Stationary Light Mobility · Unreal Engine Documentation, 2026 · docs · accessed 2026-10-21
  9. Epic Games · Lumen brings real-time global illumination to Fortnite Battle Royale Chapter 4 · Unreal Engine tech blog, 2022 · article · accessed 2026-10-21
  10. Epic Games · Lumen Technical Details · Unreal Engine Documentation, 2026 · docs · accessed 2026-10-21

Also consulted

  • Juan Linietsky, Ariel Manzur and the Godot community · Faking global illumination · Godot Engine documentation · docs · accessed 2026-10-22

Last updated 2026-10-22