OCIO Transform
Real colour management, minus the config wrangling
- image
- image
- metadata
This is the node that decides whether Radiance is a toy or a tool. The KB's read on the whole colour-management corner is that it's real, thinly discussed, and specialist - "OCIO" shows up in barely a handful of threads in the corpus, and "OpenImageIO" in fewer, because the people who need it talk in VFX channels, not r/StableDiffusion. The reason to care is concrete: hand an sRGB PNG to a Nuke comp and gamma-encoded values get treated as linear light, which blows out every merge. You need to decode to scene-linear, speak the same transforms as the rest of the shot, and carry float.
OCIO Transform does exactly that, using an actual OpenColorIO config rather than a hardcoded matrix. It's the general-purpose partner to HDR Color Convert: that node does fast primaries math, this one runs whatever your config can express, including camera logs and looks.
How it works
You name a source_colorspace and a target_colorspace, and OCIO resolves both against the active config, then runs the processor. The pack does the setup for you at startup: if you already have $OCIO set, it uses yours (validated, never overwritten - the same contract as Nuke and Resolve). Otherwise it activates OpenColorIO's built-in ACES 2.0 studio config, serialising it once to ACES/studio-config.ocio inside the package so that other tools and custom nodes that only accept a path can use the same file. On OpenColorIO older than 2.2 there are no built-in configs, so it falls back to the bundled ACES 2.0 CG config. Nothing downloads.
Aliases and roles resolve, which is the quality-of-life feature: ACEScg, ACES - ACEScg and lin_ap1 all land on the same space.
Inputs and outputs
Required: image, source_colorspace (default ACEScg), target_colorspace (default ACEScct). Both are free-text strings, and the tooltip tells you to connect ACES Config Manager → List Colorspaces to see valid names in your config - do that once and save yourself a lot of typos.
Optional: ocio_config_path (blank uses the environment or the locally installed config), look (e.g. ACES 1.3 Reference Gamut Compress, which is a genuinely good look to have available), exposure_stops, direction (Forward or Inverse), and clamp_output.
Two design details worth understanding. exposure_stops multiplies the raw source values by 2^stops before the transform, so it's true exposure only when the source is linear - on a log source it's just a pre-scale. And direction: Inverse runs target→source, which is how you write a roundtrip test: forward then inverse, then check the reconstruction error is near zero.
Outputs: image and metadata. Alpha passes through untouched; only RGB goes through OCIO.
Install
Manager → search Radiance → Install → restart ComfyUI → refresh your browser. Manual:
cd ComfyUI/custom_nodes
git clone https://github.com/fxtd-studios/radiance.git
cd radiance
python -m pip install -r requirements.txt
Windows portable users: python_embeded\python.exe for the pip step. OpenColorIO is a hard requirement of the pack, and install.py will also try to make sure OpenEXR, diffusers and accelerate are present - because the colour pipeline is built on the first two.
Where people get burned
CG config versus studio config. The two bundled configs aren't equivalent: camera log targets like ACES - ARRI LogC4 (EI800) or ACES - Sony S-Log3 SGamut3.Cine need the ACES Studio config. If you set your own $OCIO to a CG config, those names won't exist, OCIO will refuse the transform, and it'll look like the node is broken rather than the config being smaller than you assumed.
clamp_output off is correct for HDR. Leave it on and you'll clip legitimate values above 1.0 in log or HDR outputs - the tooltip warns about this, and it's easy to flip "for safety."
The config is process-wide. Radiance makes its chosen config OCIO's current config so every OCIO consumer in ComfyUI resolves the same names. Useful for consistency, but it also means another pack that wanted a different config is now sharing yours.
Inputs (8)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | Image encoded in source_colorspace. RGB goes through OCIO; alpha is passed through unchanged. | |
| source_colorspace | STRING | ACEScg | OCIO colorspace name of the input image. Connect ACESConfigManager -> List Colorspaces to see valid names. Aliases and roles are accepted: in the bundled ACES CG config 'ACEScg', 'ACES - ACEScg' and 'lin_ap1' all resolve. Camera log spaces such as 'ACES - ARRI LogC4 (EI800)' need the ACES Studio config, not the bundled CG one. |
| target_colorspace | STRING | ACEScct | Desired output colorspace. Any OCIO name, alias or role in the active config. Bundled CG config log target: 'ACEScct'. Camera log targets ('ACES - ARRI LogC4 (EI800)', 'ACES - Sony S-Log3 SGamut3.Cine') require the ACES Studio config. |
| ocio_config_pathopt | STRING | Path to .ocio config file. Leave empty to use the OCIO environment variable or the locally installed ACES config. | |
| lookopt | STRING | Optional OCIO Look name to bake in, e.g. 'ACES 1.3 Reference Gamut Compress'. Leave empty for a plain colorspace transform with no look. | |
| exposure_stopsopt | FLOAT | 0.0-10–10 | Pre-transform exposure in stops (multiplies by 2^stops). Applied to the raw source values before the OCIO transform, so it is true exposure only when the source colorspace is linear. |
| directionopt | COMBO | Forward | Forward: source -> target. Inverse: target -> source (useful for roundtrip tests or undoing a previously applied transform). |
| clamp_outputopt | BOOLEAN | false | Clamp output to [0, 1]. Disable for HDR / log outputs where values legitimately exceed display range. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |
| metadata | STRING | — |