
The Day preset applied at runtime — warm sun raking across the rock face.
Lighting Pipeline
Time of Day: Runtime Day/Night Lighting System
Unreal Engine 5.4 · C++ · Movie Render Queue
- Problem
- The level shipped lit exactly one way: baked, static, night. A second time of day was not a slider, it was a second bake — and the project was running DX11 with Shader Model 5, so Lumen and Virtual Shadow Maps were not disabled, they were unavailable.
- Constraints
- A third-party environment used as-is, in a project holding around thirty other baked levels that all had to keep working. The pack’s candle Blueprint carried a shadow-casting point light, and there were 132 instances of it.
- System
- Moved to DX12 and Shader Model 6, enabled Virtual Shadow Maps, set the sun, sky and every local light to Movable with the sky light on Real-Time Capture, and took the baked lighting data out of the content directory. On top of that, a C++ actor holding two instances of one struct: a preset describes an entire look — sun angle, colour, intensity, volumetric scattering, sky, fog, grade, lamp multipliers and particle visibility — and the controller applies or interpolates between them at runtime.
- Result
- 143 dynamic shadow casters down to 11. 1.1 GB of baked lighting data removed. 49 standalone lights and 264 inside Blueprints converted to Movable. Frame time before and after has not been captured.
Measured
- Dynamic shadow casters
- 14311
- Baked lighting data removed
- 1.1 GB
- Lights converted to Movable
- 49 standalone + 264 in Blueprints
Technical artist — lighting pipeline, C++ tooling, optimisation
What it taught Three bugs were worth writing down, and the most expensive was measurement rather than code: the editor viewport applies physical camera exposure and Movie Render Queue does not, so every value tuned by eye was about ten stops out when rendered.




