Your renderer works in linear light. Your display does not. Tone mapping is the bridge, and the choices you make there shape how everything else reads.
Where Tone Mapping Sits
Tone mapping sits near the end of the pipeline: render (linear) → exposure → post-processing → tone map → gamma encode → display.
Everything before the tone mapper operates on unbounded linear values. Everything after is clamped to the display's range. Post-effects like bloom and color grading need to run before it, on linear data, or they produce physically incorrect results. Bloom applied after tone mapping spreads less than it should because the bright pixels have already been compressed and no longer carry their actual intensity.
Why Tone Mapping Exists
Renderers accumulate light in linear space. Direct sunlight hitting a surface can reach around 100,000 cd/m²; the sun disk itself sits around 1,600,000,000 cd/m². A standard display outputs values between 0 and 1. Without tone mapping, anything above 1.0 clips to white and all the detail in bright areas disappears. The specular highlight on a car hood, the gradient across a lit wall. Gone.
Tone mapping is the function that remaps that unbounded range into something a display can show, in a way that still reads as light. The goal is not just compression. It is compression that preserves relative brightness relationships, retains detail in both highlights and shadows, and avoids the flat, washed-out look of a simple clamp.
The eye adapts logarithmically, far more sensitive to differences in shadow than in highlights, as explored in Day 18 - 🔬 Deep dive - Linear Luminance. A good tone mapper approximates that adaptation response, so the result feels close to how the eye would have read the original scene.
The Operators
Not all tone mappers are equal, and the differences matter more than they might seem.
Reinhard is the simplest: it divides each pixel's value by itself plus one (c / (c + 1)). The result is always between 0 and 1, and it never clips. The problem is that it compresses the entire luminance range uniformly. Midtone contrast suffers, and scenes tend to look flat and desaturated. It is useful for understanding the concept but rarely the right choice for production.
Filmic (Uncharted 2 / Hable) was developed by John Hable for Uncharted 2 and popularized through his Filmic Worlds blog. It is an S-curve with a controllable toe (shadow lift) and shoulder (highlight rolloff), tuned to approximate the look of photochemical film. It preserves more midtone contrast than Reinhard, and it was the first widely-used game operator that intentionally modeled filmic response. Many engines that say "filmic" are still running a variant of this.
ACES (Academy Color Encoding System) was developed by the Academy of Motion Picture Arts and Sciences as an industry-wide standard for film production. In game pipelines, what most engines expose is a simplified approximation of the ACES curve rather than the full ACES transform; the full system includes a Reference Rendering Transform (RRT) that converts scene-linear to a canonical image state, followed by an Output Device Transform (ODT) tailored to the target display. Unreal Engine uses a simplified fit of the ACES curve. The result is an S-shape that lifts deep shadows slightly, keeps midtones largely intact, and softly rolls off highlights into a warm, saturated range.
AgX is a more recent operator, now the default in Blender. It was designed to handle high-energy inputs (very bright lights, fire, emissive materials) more gracefully than ACES, avoiding the strong color shift in the highlights that ACES produces. It is gaining traction in offline rendering and starting to appear in real-time contexts.
The ACES Curve in More Detail
The highlight rolloff is the part most people notice first when switching to ACES. Bright areas do not blow out to pure white. Instead they compress into a warm, slightly desaturated range, which is why ACES gives skies, fire, and windows a distinctly filmic quality.
The color shift is not a bug. As luminance increases, the S-curve compresses the high end more aggressively, and the relative proportions of R, G, and B change in the process. The result is a warm cast in the highlights, similar to what happens on real film. It is an intentional aesthetic property, but it means your materials and lighting are being viewed through a curve that has an opinion. An emissive material tuned to look correct under ACES will look different under AgX or a neutral display.
The shadow lift is subtler. The toe of the ACES curve pushes near-black values slightly above zero, which can make very dark areas feel lifted rather than pure black. Whether that reads as cinematic or muddy depends on the scene.
Practical Takeaway
The tone mapper is not a post-process you add after the scene looks good. It is part of how your scene looks. Author and validate in the same tone mapping context your target platform will use. Switching operators at the end of a project is not just a color grade; it can fundamentally change how your materials and lighting read.
If your bright materials feel muddy or highlights are shifting color unexpectedly, check whether the tone mapper is responsible or whether the issue exists before it. Toggling the tone mapper on and off is a reliable diagnostic: it separates problems in the linear data from problems the curve is introducing.
One thing worth remembering from Day 18 - 🔬 Deep dive - Linear Luminance: because the eye adapts logarithmically, small numerical differences in shadow areas produce larger perceptual shifts than the same differences in highlights. Tone mappers behave the same way: the toe of the curve will amplify any noise or imprecision in your dark values more than you expect.
© 2026 Stefan Groenewoud - All views are my own, not those of my employer.


