◎ Radiance HDR Tone Map
The one node that makes float output actually watchable
- image
- image
If you've ever decoded a latent, gotten a float image, and looked at it in a normal preview to find it washed out or blown - you've hit the reason tone mapping exists. A linear HDR image can't be displayed directly; it has to be tone mapped: a curve that compresses a huge dynamic range into the ~8 stops an SDR screen can show, while keeping the highlights from clipping. HDRToneMap is Radiance's end-of-chain node for exactly that job, with real operators behind it and GPU acceleration.
The key detail most "tone map" nodes get wrong: which curve. This one gives you the actual algorithms people argue about. filmic_aces (industry-standard film curve), filmic_uncharted2 (the game-industry favorite), agx (Blender's modern default, so hot right now), the reinhard family (classic, color-preserving), plus linear_clamp and exposure_only. That operator menu is the node's whole personality - it's the difference between "filmic" and "S-curve" being a marketing word versus being a real equation.
Presets are the fast path
The preset dropdown (it overrides everything below, per the tooltip) is where a beginner should live: Cinematic Film, HDR Display, Web/Social, Print Ready, Game Engine, Photography, Low Key/Dark, High Key/Bright. Each one is a hand-tuned config in the source - Cinematic Film is filmic_aces with contrast 1.1 and a touch of shadow lift; HDR Display is agx with a 2× white point; Print Ready uses reinhard_luminance with less contrast. Pick a preset, run, and only dive into the manual controls when you know why the preset isn't right.
The controls that matter
- operator - the algorithm itself, listed above. Start with
filmic_aces; switch toagxwhen you want Blender's flatter, modern rolloff. - exposure (±5 stops) - set the overall level before the curve. This is the first knob, always.
- white_point (0.5–10, default 1) - how much headroom maps to white. Higher = gentler highlight rolloff, fewer blown skies.
- gamma (1–3, default 2.2) - the display gamma after tone mapping. Leave at 2.2 for sRGB unless you know better.
- highlight_compression (0–1) and shadow_lift (0–0.2) - the two "rescue" knobs for clipping ends.
- contrast / saturation - the finishing flavor.
- use_gpu (default true) - CUDA when available, CPU fallback otherwise.
Output: a single image - "tone-mapped SDR image ready for display or export," per the tooltip. This is a terminal step: after this node, you're in display space and should save or deliver.
Where it fits
The classic chain in this pack: ImageToFloat32 → grade (Float32ColorCorrect or a Grade node) → HDRToneMap → save. If you're going to HDR display output (PQ/HLG) rather than SDR, the ACES 2.0 Output Transform is the more correct destination - HDRToneMap is the SDR-ready generalist. Honest note: it overlaps with any "filmic" tonemap you already have in your favorite pack; you're here for the operator selection and the presets, which are genuinely better-curated than most.
Install
Part of Radiance - ComfyUI Manager → search Radiance, or:
cd ComfyUI/custom_nodes
git clone https://github.com/fxtdstudios/radiance.git
cd radiance
pip install -r requirements.txt
Restart. Under FXTD Studios/Radiance/Color.
Inputs (11)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | Input HDR or SDR image to tone map | |
| presetopt | COMBO | ◎ Cinematic Film | Quick look preset. Overrides settings below. |
| operatoropt | COMBO | filmic_aces | Tone mapping algorithm: • filmic_aces: Industry-standard film curve • filmic_uncharted2: Game industry favorite • agx: Modern Blender default • reinhard: Classic, preserves color • linear_clamp: Simple clip |
| exposureopt | FLOAT | 0.0-5–5 | Exposure adjustment in stops. Negative = darker, Positive = brighter. |
| gammaopt | FLOAT | 2.21–3 | Display gamma. 2.2 = sRGB standard. Higher = darker midtones. |
| white_pointopt | FLOAT | 1.00.5–10 | Maximum brightness that maps to white. Higher = more headroom for highlights. |
| contrastopt | FLOAT | 1.000.5–2 | Contrast adjustment around midpoint. >1 = more punch. |
| saturationopt | FLOAT | 1.000–2 | Color saturation. 0 = grayscale, 1 = original, >1 = vivid. |
| highlight_compressionopt | FLOAT | 0.500–1 | Compress highlights to prevent clipping. 0 = no compression, 1 = full. |
| shadow_liftopt | FLOAT | 0.000–0.2 | Lift shadows to reveal detail. 0 = no lift, 0.1 = subtle. |
| use_gpuopt | BOOLEAN | true | Use GPU acceleration when available. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | Tone-mapped SDR image ready for display or export. |