ACES IO — Viewer (Nuke Viewer)
Why your ACES render looks washed out — and the node that fixes it
- image
- ocio_config
- input_colorspace
- display
- view
- image
ACES IO - Viewer is the node that answers the most common complaint in this whole pack: "I loaded a proper EXR and it looks flat, grey, and wrong." Nothing is broken - your image is stored in scene-linear ACEScg, which is meant to hold raw light values, not to look like a picture. The Viewer is the Nuke-style monitor you put at the end of the chain that does the display transform (scene-linear → sRGB) so what you're looking at is what a colourist would see. Nuke users will recognize it instantly: it's built on OCIO's LegacyViewingPipeline, the same machinery as the actual Nuke Viewer.
What it actually does
The Viewer doesn't just cram a gamma curve on top. It runs the full viewing pipeline: your input_colorspace (default ACEScg) → exposure → channel swizzle → display view transform → display-space gamma. Two of those knobs are the ones you'll actually touch, and they mirror Nuke's Viewer E and G knobs:
- exposure (−10 to +10 stops) - applied in scene-linear space, i.e. before the display transform. This is a true exposure offset on light values, exactly the "E" knob.
- gamma (0.1 to 4.0) - applied after the display transform, in display-referred space, like the "G" knob. Bump it when the monitor preview feels dark, not when the scene itself is underexposed.
Then there's display (default sRGB - Display) and view (default ACES 2.0 - SDR 100 nits (Rec.709)), and a channel dropdown that lets you inspect single channels - R, G, B, A, or Luminance - which is invaluable when you're checking whether your alpha actually survived an EXR roundtrip. The optional looks_override / looks_override_enabled pair lets you force a look (say, a gamut compression) into the view, bypassing what the view transform itself declares.
The output is a single image, so unlike a pure preview node this thing can sit mid-graph and feed a saver. But realistically you'll hang it off the end of your chain: EXR Loader → ColorSpace → [your nodes] → Viewer → Preview, and use the exposure slider as your "is this lighting actually good?" check.
Install
It ships in the BISAM20/ComfyUI-ACES-IO pack. ComfyUI Manager → Install Custom Nodes → search ComfyUI-ACES-IO, or:
cd ComfyUI/custom_nodes
git clone https://github.com/BISAM20/ComfyUI-ACES-IO
cd ComfyUI-ACES-IO
pip install -r requirements.txt
The one dependency that actually matters is PyOpenColorIO - note the Python package is named opencolorio (PyOpenColorIO isn't on PyPI under its own name). Install via Manager and it handles this automatically; manually, pip install opencolorio>=2.3.0 or conda install -c conda-forge opencolorio. No model downloads - ACES 2.0/1.3 configs ship inside OCIO itself.
Where people get burned
- Stale previews. This pack deliberately makes every node re-execute on every run (it returns
nanfromIS_CHANGED), so your exposure changes always apply. That's a feature - colorspace nodes caching wrong is the usual pain elsewhere. - Wrong display/view after switching configs. If you change the config in the Config Loader and the saved
display/viewno longer exist in it, the node silently falls back to the new config's defaults instead of crashing. If your preview suddenly looks different, check that. - Don't use the Viewer as a final transform. It's a monitor. When you want to bake the display transform into pixels - e.g. to save an sRGB file - reach for the ACES IO - Display Transform node instead. That's the difference between looking and committing.
Inputs (10)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| ocio_config | OCIO_CONFIG | — | |
| input_colorspace | ACES_COLORSPACE | ACEScg | — |
| display | ACES_DISPLAY | sRGB - Display | — |
| view | ACES_VIEW | ACES 2.0 - SDR 100 nits (Rec.709) | — |
| exposure | FLOAT | 0.0-10–10 | Exposure offset in stops (linearCC, scene-linear space) |
| gamma | FLOAT | 1.000.1–4 | Display gamma correction (displayCC, after display transform) |
| channel | COMBO | RGBA | 6 options: RGBA, R, G, B, A, Luminance |
| looks_overrideopt | STRING | — | |
| looks_override_enabledopt | BOOLEAN | false | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |