Nodes/OpenClip/OpenClip Colour Transform
ComfyUI Node

OpenClip Colour Transform

The colour node that makes log footage look like what your model trained on

By allklier·Created 3 months ago·Updated 22 days ago· 0
OpenClip Colour Transform
  • IMAGE
  • MASK
  • IMAGE
  • MASK
ocio_config
input_colour_space
viewACES 2.0 - SDR 100 nits (Rec.709)

Diffusion models were trained on ordinary Rec.709/BT1886 display-referred images. VFX plates arrive as log or camera colour space - wider gamut, scene-linear, and aggressively not-Rec.709. Feed raw log footage straight into an img2img model and you get the washed-out, wrong-hue result that makes people swear AI can't touch VFX. The OpenClip Colour Transform exists to fix exactly that handoff: it runs an OCIO view transform that converts the clip's log/camera space into the Rec.709 look your model actually expects.

How it works

OCIO is OpenColorIO, the industry-standard colour-management library, and this node wraps it through PyOpenColorIO. It builds a DisplayViewTransform: input colour space → display (Rec.1886 Rec.709) → view (default ACES 2.0 - SDR 100 nits (Rec.709)). That view step is the part that matters. A plain colour-space-to-colour-space conversion into a display space skips the ACES Output Transform, so bright saturated pixels come back negative or above 1.0 - out-of-range values are how you get bad reds and models hallucinating on nonsense pixels. The view is the tone-mapping and gamut-compression step, and the default is picked to match what Flame expects on import.

The config resolves in order: the $OCIO environment variable first, then the newest Flame ACES 2.0 config under /opt/Autodesk/colour_mgmt/configs/flame_configs/*/aces2.0_config/config.ocio, then empty. On a Flame workstation it just works out of the box; elsewhere you'll usually point it at your project's config by hand.

The inputs

  • IMAGE - required, obviously.
  • ocio_config - path to a .ocio config file. Auto-detected, but you'll often override it.
  • input_colour_space - the name of the source space as registered in the config (the ACES or log space your clip came in). Required; the node raises a hard error if it's empty, which is deliberate - a silent passthrough here would quietly poison everything downstream.
  • view - defaults to ACES 2.0 - SDR 100 nits (Rec.709); any view the config exposes works, so HDR or un-tone-mapped variants are one text edit away.
  • MASK - optional, passed through untouched (zero-filled if absent, since the outputs expect both).

Where it sits

The README's advice is exactly right: insert it right after the Reader and before the model. IMAGE feeds the model, MASK keeps your alpha in the pipe. It's the bridge between "what Flame gave you" and "what the diffusion model wants", and it's the node that makes the whole round-trip concept work - skip it and your pipeline is technically functional but colour-broken.

How to install it

Same pack as the Reader and Writer:

cd ComfyUI/custom_nodes
git clone https://github.com/allklier/ComfyUI_OpenClip.git

or ComfyUI Manager (search "ComfyUI_OpenClip"), then restart. This is the one node that specifically needs opencolorio on top of the shared lxml + openimageio dependencies - Manager installs all three from requirements.txt. If you're not doing colour-managed work, skip the pack's opencolorio requirement entirely; the other two nodes run fine without it.

Where people get burned

  • The config field comes up blank on a non-Flame machine. Set $OCIO or just type the path to your .ocio.
  • Forgetting input_colour_space - you'll get a hard error, which is the pack being helpful, not broken.
  • Swapping in a different view changes the look more than you'd expect - the ACES Output Transform does real tone-mapping work, not a gentle grade. Test on a still before committing a full sequence.
CategoryOpenClip

Inputs (5)

NameTypeDefaultDescription
IMAGEIMAGE
ocio_configSTRING
input_colour_spaceSTRING
viewSTRINGACES 2.0 - SDR 100 nits (Rec.709)
MASKoptMASK

Outputs (2)

NameTypeDescription
IMAGEIMAGE
MASKMASK