Nodes/radiance/◎ Radiance Color Space Convert
ComfyUI Node

◎ Radiance Color Space Convert

The Radiance universal color space switcher

By fxtdstudios·Created 7 months ago·Updated 9 days ago· 242
◎ Radiance Color Space Convert
  • image
  • image
source_spacesRGB
target_spaceACEScg
exposure0.00
gamma_adjust1.00
chromatic_adaptationBradford
use_gputrue

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.

CategoryFXTD Studios/Radiance/Color

Inputs (7)

NameTypeDefaultDescription
imageIMAGE
source_spaceCOMBOsRGB12 options: sRGB, Linear_sRGB, ACEScg, ACEScct, ACES2065-1, Rec709, +6
target_spaceCOMBOACEScg12 options: sRGB, Linear_sRGB, ACEScg, ACEScct, ACES2065-1, Rec709, +6
exposureoptFLOAT0.00-10–10Exposure adjustment in stops (EV)
gamma_adjustoptFLOAT1.000.1–5Gamma adjustment (1.0 = no change)
chromatic_adaptationoptCOMBOBradford4 options: Bradford, Von Kries, XYZ Scaling, None
use_gpuoptBOOLEANtrue

Outputs (1)

NameTypeDescription
imageIMAGE