Computer Graphics · Color and Display
Tone Mapping Operators: Reinhard, Filmic, and Why a Clamp Loses the Image
What happens when scene luminance outruns a display, why a hard clip wastes the highlight, and how the three families of operators compress the range.
A physically-based renderer produces radiance values that span many orders of magnitude: a sunlit scene can put a directly lit surface at hundreds of cd/m² while a shadowed surface sits at a fraction of one, a ratio of a thousand or more. A display can reproduce roughly a hundred to one, and 8-bit sRGB storage compresses that further. Tone mapping is the operation that takes the scene-referred values and produces display-referred values in a bounded range, and the design space is how to spend the limited output range. A clamp spends it all on the shadows and mid-tones and throws the highlights away.
The clamp and what it wastes
The simplest “tone map” is a clamp to 1.0, with the sRGB encode applied afterward. It is not a tone map in any meaningful sense; it is a truncation. Every scene value above 1.0 maps to exactly the same output, so a specular highlight, a bright sky, and a light source all render as the same white patch with no structure. The visible result is the familiar flat white pool where a highlight should be, with a hard edge at the boundary where values cross 1.0.
The edge is the worst artifact. At the boundary, a smooth gradient in the scene has a discontinuity in the derivative of the output, which the eye detects as a contour. Adjacent pixels with scene values 0.98 and 1.02 map to outputs that differ by the difference between 0.98 and 1.0, while pixels at 1.02 and 10.0 map to identical outputs; the spatial gradient vanishes exactly where the image is brightest, which inverts the natural cue that bright regions should carry the most detail.
A clamp also discards data before it can be used by anything downstream. Bloom needs the pre-clamp values to know how much light spilled from a source; a highlight roll-off needs the shape of the curve above 1.0; and a subsequent grade cannot recover a clipped channel. Once a value is saturated to white, the information is gone, which is why any pipeline that plans to do more than one operation on the image keeps values in a high dynamic range format until the last stage.
The three families
Reinhard. The operator normalizes luminance so that a chosen key value maps to a fixed output, then applies a rational compression, $\frac{L}{1+L}$ in its simplest global form, with a pre-scaling by the scene key and a post-scaling by the display’s maximum. The rational function is smooth everywhere, maps zero to zero, and approaches 1 from below as $L$ grows, so no highlight ever clips; it merely asymptotes. The derivative at the origin is 1, so the shadows are preserved unchanged, and the mid-tones are compressed by an amount that grows with luminance. The local variant divides by a locally averaged luminance rather than a global key, which compresses based on local contrast and is the mechanism that allows a bright window and a dark interior to coexist in one image; it is also the source of halo artifacts when the local average blurs across a strong edge.
The Reinhard operator’s characteristic is a soft shoulder. Highlights compress but never flatten completely, and the result is gentle on photographic content at the cost of contrast in the mid-tones, which must be recovered with a subsequent contrast adjustment. The operator has no black compensation, so deep shadows can crush if the key is set low.
Filmic. The filmic curves are built from a rational or exponential family that has a toe and a shoulder, modelled on the characteristic curve of photographic film, which has a linear middle and compresses both the shadows and the highlights. The canonical reference is the ACES output transform and its predecessors, which map a wide scene-referred range through a sigmoid-like curve with a long highlight shoulder that preserves separation between bright values while never reaching pure white until the input is far above the display range.
The filmic curve’s signature is colour behaviour. Because the shoulder is applied to each channel after the curve is designed in a luminance-like space, the hue of a highlight can shift toward the primary that saturates last, producing the characteristic white of a filmic grade rather than a neutral roll-off. That hue shift is a deliberate part of the look and a liability when fidelity is the goal, and it is treated in why tone mapping shifts hue.
Perceptual and display-referred. A third family compresses in a perceptual space — apply the tone curve to luminance and reinstate colour, or apply a curve that is defined directly against the display’s EOTF so that the output is perceptual code values rather than linear light. These operators are the ones specified for HDR delivery, and the curve is the subject of the ST 2084 transfer function, where the compression is built into the encoding itself rather than applied as a separate operator.
| Operator | Shadows | Mid-tones | Highlights | Halo risk |
|---|---|---|---|---|
| Clamp | unchanged | unchanged | hard clip, no roll-off | none |
| Global Reinhard | unchanged | compressed | asymptote, never clips | none |
| Local Reinhard | depends on local average | local contrast | soft shoulder | high |
| Filmic (ACES-style) | lifted (toe) | linear | long shoulder | low |
What the key and exposure actually control
Exposure and tone mapping are different operations that are often confused because both act on the same values. Exposure is a global scale applied in linear light before the curve: doubling exposure doubles every scene value. Tone mapping is the nonlinear compression after exposure. Moving exposure moves the whole histogram along the curve, so a brighter exposure pushes more of the image into the shoulder, and a darker exposure pushes more into the toe. The shape of the curve — where the shoulder begins, how hard it compresses — is the tone map; the scale is the exposure.
A well-known failure is adjusting the tone map to fix an exposure problem. If the image is too dark because exposure is low, pulling the tone map’s mid-point up recovers the mid-tones but also lifts the shadows into the toe differently and changes the highlight behaviour, producing a grade that is right in the middle and wrong at both ends. The two parameters are separable and should be treated as such: exposure before the curve, tone map on the curve.
Order of operations and the spaces involved
Tone mapping must happen in linear light, and the reason is the same as for blending: the curve is a nonlinear operation on radiance, and applying it to encoded values compounds two nonlinearities. The standard order is: render or composite in linear HDR, apply exposure, apply the tone map, convert to the destination colour space, and apply the display encode last. Inserting a display encode before the tone map means the tone curve operates on encoded values, which compresses the shadows and mid-tones far more than intended because the encode has already applied its own compression.
The colour space of the tone map matters for the hue question. A curve applied to RGB channels independently shifts saturation and hue, because compressing a colour’s components by a nonlinear function changes their ratios. A curve applied to luminance and then to the colour-difference or chroma channels preserves the ratios of the channels and therefore the hue and saturation, at the cost of a colour-space conversion before and after the curve. The choice is a fidelity-versus-look decision, and the colour-space mechanics are the same ones behind conversion chains.
Failure modes
The local operator’s halo is the most famous. When the local average is computed with a filter that crosses a high-contrast edge, the average on the bright side includes the dark side’s contribution and vice versa, so the bright side is compressed less and the dark side more, and a light or dark band appears along the edge. The fix is an edge-stopping filter that excludes large differences from the average, at the cost of more complex and more expensive filtering.
Saturation loss is the second. A hard luminance compression leaves the chroma unchanged, so a vivid colour in a bright region becomes grey as the luminance folds down toward white. The standard response is to boost saturation after the curve, which is itself a nonlinear operation that can reintroduce clipping in the gamut, connecting to gamut mapping.
The third is a mismatch between the tone map and the display. An operator designed for a 100 cd/m² display applied to content shown on a 1000 cd/m² display looks flat and washed out, because the curve is compressing a range the display could have reproduced. Display-referred tone mapping for HDR makes the curve a function of the display’s actual capability, and the encoding that encodes that capability into the signal is the PQ curve of ST 2084.
References
- Photographic Tone Reproduction for Digital Images (2002) — Erik Reinhard, Michael Stark, Peter Shirley, James Ferwerda, ACM Transactions on Graphics
- ACES Technical Bulletin TB-2014-001: Academy Color Encoding System — Input Transform — Academy of Motion Picture Arts and Sciences
- High Dynamic Range Imaging: Acquisition, Display, and Image-Based Lighting — Erik Reinhard et al., Morgan Kaufmann