Colour Management
Colour management is the last stage of the frame and the one that determines whether all the work done by the lighting and ray tracing systems actually reaches the display looking correct.
The pipeline
The renderer works in linear HDR throughout. At the end of the frame:
SMAA resolves edges, in linear space, before tonemapping.
Colour grading applies the post process volume's exposure, white balance, saturation, contrast, gain, gamma and offset controls, plus any colour grading LUT.
Tonemapping maps the HDR range into the display range using the ACES filmic curve.
Output encoding applies the transfer function for the target display, sRGB for SDR or PQ/ST-2084 for HDR.
Tonemapper controls
CVar | Default | Purpose |
|---|---|---|
|
| Use the ACES film tone mapper. |
|
|
|
|
| Sharpening in the tonemapper, clamped at 10. |
|
|
|
|
|
|
|
| Gamma applied on output |
r.Tonemapper.Quality is a genuine scalability lever. Each step down removes a feature from the tonemapper shader, producing a cheaper permutation. If your project does not use vignette, film shadow tint or grain, dropping the quality level costs nothing visually and saves both frame time and shader permutations.
r.Tonemapper.Sharpen deserves care. A small amount of tonemapper sharpening can compensate for perceived softness, but it operates after anti-aliasing and will re-introduce aliasing on edges SMAA just resolved. If the image looks soft, first confirm that you are actually rendering at native resolution and that no upscaler is active.
Colour grading
All grading is done through post process volumes under Color Grading. The controls are organised into Temperature, Global, Shadows, Midtones and Highlights, each offering saturation, contrast, gamma, gain and offset.
Grading in Unreal is applied before tonemapping, in linear space. This is why grading values that look correct in a 2D image editor do not transfer directly — you are grading scene-referred linear data, not display-referred pixels.
LUTs. A colour grading LUT can be assigned in the post process volume with a blend weight. Author LUTs against a neutral capture of your scene rather than against an already-graded one, or the grades compound.
HDR output
CVar | Purpose |
|---|---|
| Enables HDR output support for the project. Usually set per-project or per-platform in |
| Selects the output transfer function |
| Selects the output colour gamut |
HDR output interacts with SMAA correctly because SMAA runs before tonemapping in Vite. Anti-aliasing implementations that run after the tonemapper generally have to be reworked for HDR output; this one does not.
Slate and UI are composited with knowledge of the output device via r.TonemapperGamma, but UI authored against an SDR reference will look wrong in HDR. Budget time to check your UI in HDR specifically rather than assuming it transfers.
Common problems
- The scene looks washed out or milky
Usually excessive ambient or fog rather than a grading problem. Check whether AO is being applied and whether your GI intensity is too high. Compare against a path-traced reference before reaching for contrast in the grade.
- Colours shift between the editor viewport and packaged builds
Almost always a different output device or a post process volume that is not unbound. Confirm
r.HDR.Display.OutputDevicematches in both, and check for editor-only post process volumes.- Banding in gradients and skies
Check
r.Tonemapper.GrainQuantizationis1. If banding persists on an HDR display, the source gradient itself may be quantised — check the sky texture or gradient material precision.- The image is sharp in the editor and soft in game
Confirm no upscaler is active. See Upscalers and Frame Generation. Vite renders at native resolution by default; an upscaler enabled in a game settings menu is the usual cause.