Nodes/ComfyUI-Darkroom/ACES Tonemap
ComfyUI Node

ACES Tonemap

The tonemapping node ComfyUI has been missing

By jeremieLouvaert·Created 5 months ago·Updated 3 days ago· 101
ACES Tonemap
  • image
  • image
curveACES Filmic (Narkowicz)
input_is_linearNo (sRGB input)
exposure_bias0.0
tonemap_in_acesYes
white_point4.0
strength1.00

Most ComfyUI image work never thinks about dynamic range - the model gives you an sRGB picture and you're done. But the moment you touch HDR, linear-light rendering, or anything ACES-related, you hit a wall: there's no built-in tonemapper in base ComfyUI. ACES Tonemap is that missing piece. It takes high-dynamic-range values and rolls them into a displayable range using the industry-standard curves - the exact math that film and game pipelines use.

How it works

Tonemapping is how you compress an HDR image into something a monitor can show without clipping everything to white. This node implements the canonical curves as a curve dropdown:

  • ACES Filmic (Narkowicz) - the standard Academy look, and the default. The reference curve from the film industry's color pipeline.
  • ACES Fitted (Hill) - a fitted approximation of the ACES curve; the other "standard Academy look."
  • AgX (Blender) - the modern Blender default. It's the current darling of the 3D world because it handles saturation rolloff more gracefully than ACES Filmic.
  • Reinhard and Reinhard Extended - the classic simple curves. Reinhard Extended takes a white_point (1–16, default 4) to set where highlights fold over.
  • Filmic (Uncharted 2) - the famous game-look curve from Uncharted 2's rendering tech.

It's not just the curve, though. There's real color management underneath: with tonemap_in_aces set to Yes (the default), the node converts to ACEScg before tonemapping, which is the recommended path for the ACES curves.

The inputs that matter

  • curve - pick your tonemapper. Start with ACES Filmic; try AgX for a punchier, more modern rolloff.
  • input_is_linear - this is the one that bites people. Default is "No (sRGB input)", meaning the node removes sRGB gamma before tonemapping. If you're feeding it from Color Space Transform or an HDR source, switch to "Yes (linear/HDR input)".
  • exposure_bias - EV stops of exposure before tonemapping (−4 to +4). Positive brightens, negative darkens. This is how you rebalance an HDR image before the curve squashes it.
  • white_point - only used by Reinhard Extended; ignored by the others.
  • strength - the universal blend slider (0–1), so you can dial a tonemap from "subtle" to "full."

Where people get burned

The classic mistake is double-gamma. If your image is already linear and you leave input_is_linear at "No", the node removes sRGB gamma from an image that has none - and everything comes out brighter and washed out. Always know what space your upstream node outputs. This is exactly why the pack pairs it with Color Space Transform (same subcategory): transform to a working space, tonemap, then optionally transform back.

Also worth knowing: tonemapping is a per-pixel color transform, which makes it one of the nodes the README allows inside a LUT bake chain. You can bake an ACES tonemap into a .cube for use elsewhere - a genuinely useful trick if you want consistent HDR handling outside ComfyUI.

Installing it

Part of the full ComfyUI-Darkroom pack:

cd ComfyUI/custom_nodes
git clone https://github.com/jeremieLouvaert/ComfyUI-Darkroom.git
pip install -r ComfyUI-Darkroom/requirements.txt

Or search "Darkroom" in ComfyUI Manager. Needs scipy, opensimplex, rawpy, exifread, Pillow. Restart and it's under AKURATE/Darkroom/Pipeline. Pure numpy - runs on CPU, no model files, no keys.

If you only ever work in sRGB, you might not need this node today. The moment you want real highlight rolloff on a high-contrast render or a linear pipeline, it's the difference between blown-out whites and something that looks like it went through an actual color pipeline.

CategoryAKURATE/Darkroom/Pipeline

Inputs (7)

NameTypeDefaultDescription
imageIMAGE
curveCOMBOACES Filmic (Narkowicz)Tonemapping curve. ACES Filmic and Hill are the standard Academy look. AgX is the modern Blender default. Filmic (Uncharted 2) is the classic game look
input_is_linearoptCOMBONo (sRGB input)Is the input already in linear light? If No, sRGB gamma is removed first. Use Yes if feeding from Color Space Transform or HDR sources
exposure_biasoptFLOAT0.0-4–4Exposure adjustment in EV stops before tonemapping. Positive = brighter, negative = darker
tonemap_in_acesoptCOMBOYesConvert to ACEScg before tonemapping (recommended for ACES curves). Set to No if input is already in the expected color space
white_pointoptFLOAT4.01–16White point for Reinhard Extended curve (ignored by other curves)
strengthoptFLOAT1.000–1Blend between original (0) and tonemapped (1)

Outputs (1)

NameTypeDescription
imageIMAGE