◎ Radiance Color Space Convert
The Radiance universal color space switcher
- image
- image
Every color space converts to every other color space, so eventually some pack ships the one node that just does all of them. This is Radiance's. It's a GPU-accelerated matrix-based converter covering the dozen spaces that actually show up in film and VFX work - sRGB, linear sRGB, ACEScg, ACEScct, ACES2065-1, Rec.709, Rec.2020, DCI-P3, Display P3, DaVinci Wide Gamut, ARRI Wide Gamut 4, and S-Gamut3.Cine - and lets you hop between any two.
If that list looks like a roster of "every camera and deliverable I've ever heard of," that's the point. It's the node you reach for when a plate from one pipeline needs to live in another, or when you want to grade in ACEScg and deliver in Rec.709 without running a gauntlet of one-way converters.
How it works
The source builds the conversion as a primaries → XYZ → primaries chain: it computes the RGB-to-XYZ matrix from the source primaries and white point, and the inverse from the target, then multiplies through. The genuinely interesting part is the optional chromatic adaptation - when source and target white points differ, it re-aims the white via Bradford (the default), Von Kries, or plain XYZ scaling. Bradford is what the industry settled on decades ago; leave it alone until you have a reason not to.
Then there's the transfer-function layer: ACEScct and the log-ish spaces get their curves applied separately (the code has explicit ACEScg ↔ ACEScct encode/decode), because a 3×3 matrix can't turn a linear value into a log value.
The inputs that matter
- source_space / target_space - the big dropdown pair. Same 12-space list on both. The only input you really have to set.
- exposure (stops, ±10) and gamma_adjust (0.1–5.0) - applied as part of the conversion, handy for matching a plate's brightness while you're in there. Keep them at 0/1.0 until you actually need them; it's easy to forget a +2 EV you dialed in for testing.
- chromatic_adaptation - Bradford / Von Kries / XYZ Scaling / None. Bradford default; change it only if you know what the difference is.
- use_gpu (default true) - the conversion can run as a matrix on the GPU instead of a numpy loop.
Output is a single image, same shape in, same shape out.
The trap to avoid
Note what this node doesn't do: it converts between linear spaces and log-ish working spaces like ACEScct, but it is not a display transform and it won't tone-map HDR down to SDR for you. If you take an HDR float image and convert it to sRGB here, the output is still the same dynamic range - just re-based - and it'll look crushed or blown until you run it through Radiance's tone map or the ACES 2.0 output transform. In other words: this is the middle of your chain, not the end.
Also worth knowing: S-Gamut3.Cine, AWG4 and DaVinci Wide Gamut all being in one list is a hint that Radiance is aimed at people who have camera plates and EXR files lying around, which is exactly the crowd the pack's community thread describes - HDR/EXR work straight in ComfyUI.
Install
ComfyUI Manager → search Radiance, or:
cd ComfyUI/custom_nodes
git clone https://github.com/fxtdstudios/radiance.git
cd radiance
pip install -r requirements.txt # Linux: install libopenexr-dev first
Restart ComfyUI and it's in the FXTD Studios/Radiance/Color menu.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| source_space | COMBO | sRGB | 12 options: sRGB, Linear_sRGB, ACEScg, ACEScct, ACES2065-1, Rec709, +6 |
| target_space | COMBO | ACEScg | 12 options: sRGB, Linear_sRGB, ACEScg, ACEScct, ACES2065-1, Rec709, +6 |
| exposureopt | FLOAT | 0.00-10–10 | Exposure adjustment in stops (EV) |
| gamma_adjustopt | FLOAT | 1.000.1–5 | Gamma adjustment (1.0 = no change) |
| chromatic_adaptationopt | COMBO | Bradford | 4 options: Bradford, Von Kries, XYZ Scaling, None |
| use_gpuopt | BOOLEAN | true | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |