CoCo Load EXR
The hub that turns 3D render passes into usable tensors
- image
- alpha
- cryptomatte
- layers
- layer names
- raw layer info
- metadata
ComfyUI can't open a multilayer EXR. It just can't - no core loader, no channel awareness, nothing. If you render in Blender, Maya, Octane or anything VFX-adjacent, that's the first wall you hit. CoCo Load EXR is the pack's front door: one file in, seven outputs out, with every layer, alpha channel, cryptomatte pass and chunk of metadata split out for you. It's the node everything else in the pack hangs off.
How it works
Everything funnels through OpenImageIO. The node scans the file's subimages and metadata first, then groups the channels into logical layers by their naming suffixes (RGB triplets become one layer, XYZ groups like normals become another, single channels stay single). Alpha gets pulled out as a mask. Anything cryptomatte-flavored - names starting with crypto or containing cryptoasset, cryptomaterial, cryptoobject, cryptoprimvar - is separated into its own dictionary instead of polluting the normal layers. So a typical Blender EXR with beauty, Z, normals and a crypto pass arrives fully decomposed before you've touched a single other node.
It's also cache-smart: IS_CHANGED hashes the file's path, modification time and size with your normalize setting, so re-running a workflow doesn't re-read a file that hasn't changed. Change the file, and it knows.
Inputs and outputs
Only two inputs, which is refreshingly simple:
image_path- full path to the EXR. Absolute paths, please.normalize- off by default. Its author's description is "Normalize image values to the 0-1 range," and that's the knob that matters for HDR: scene-linear EXRs hold values well past 1.0, so withnormalizeoff you may get something that looks black or blown until you convert colorspace or remap it. Turn it on for a quick usable view; leave it off if you want the raw linear data.
The seven outputs:
image(IMAGE) - the base RGB composite.alpha(MASK)cryptomatte(CRYPTOMATTE) - for the pack's Cryptomatte Layer node.layers(LAYERS) - every non-crypto layer, for Load EXR Layer by Name.layer names(STRING) - the processed layer names, your lookup table.raw layer info(STRING) - every channel in the file, for debugging odd naming.metadata(STRING) - a JSON dump of everything in the file.
The three STRING outputs are the pack's answer to "what's actually in this file" - wire them into a text viewer or debug node once and you'll never guess a layer name again.
Why people actually use it
The real-world pattern that shows up in the wild: load an EXR ID pass, run it through a mask from color node, and use the result to drive regional prompting or inpainting in a graph - one user ran exactly that (coco_loadexr > mask from color) to steer a FLUX generation per color region. The more common flow, though, is the pack's own: Load EXR → Load EXR Layer by Name to split passes → Colorspace to convert linear→sRGB → Z Normalize on the depth → preview. This node is step one of every one of those chains.
Installing it
Part of the CoCoTools pack - Manager ("CoCoTools") or:
cd ComfyUI/custom_nodes
git clone https://github.com/Conor-Collins/ComfyUI-CoCoTools_IO
pip install -r ComfyUI-CoCoTools_IO/requirements.txt
Common issues
- OpenImageIO missing → hard
ImportErroron load. This is the big one: the pack lists it in requirements, but it has to land in the Python ComfyUI actually runs (portable builds:python_embeded\python.exe -m pip install). README's own pip line references aComfyUI-CoCoToolsfolder that doesn't exist - the real one isComfyUI-CoCoTools_IO. - File not found → the node raises a clear
FileNotFoundError, but only if you gave it a valid path; a typo just errors at run time, so paste the path. - Looks washed out / too dark → that's scene-linear vs sRGB, not a bug. Run it through CoCo Colorspace (
Linear→sRGB) or flipnormalizefor a quick look.
Zero lifetime impressions and barely any clicks - which is a shame, because for anyone who works with real renders this is the load-bearing node of the pack. If you've been hex-editing around ComfyUI's EXR blindness, this is the fix.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| image_path | STRING | path/to/image.exr | — |
| normalize | BOOLEAN | false | — |
Outputs (7)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |
| alpha | MASK | — |
| cryptomatte | CRYPTOMATTE | — |
| layers | LAYERS | — |
| layer names | STRING | — |
| raw layer info | STRING | — |
| metadata | STRING | — |