Installation
ComfyUI Manager / Comfy Registry
Search for Radiance in ComfyUI Manager, or install it from the Comfy Registry. Nothing else needs doing:
- Dependencies install from
requirements.txt(OpenColorIO, OpenEXR, OpenImageIO, OpenCV and the rest; all ship as wheels for Python 3.9 to 3.13). On Python 3.14, which has no OpenEXR wheel yet, OpenEXR is skipped and EXR goes through OpenImageIO. - OCIO configures itself at startup: your
$OCIOif you have one, otherwise OpenColorIO's built-in ACES studio config. No files to download. - The RUDRA SDR → HDR model downloads the first time a graph needs it (about 5 MB, see Models).
- The Multipass Estimate models (MoGe-2 and Marigold IID, about 4.9 GB)
download the first time that node runs, unless its
download_missing_modelsswitch is off (see Multipass Estimate).
Checked on a clean ComfyUI 0.32 with Python 3.13: the registry package installs, all 156 nodes load, OCIO is configured, and the first SDR → HDR run fetches the model and applies it.
Requirements
Install into the same Python environment as ComfyUI. Radiance relies on ComfyUI's existing PyTorch. Dependencies are pure Python (no CUDA toolkit or compiler required). Use the requirements file that matches your platform, shown below.
Windows
cd ComfyUI\custom_nodes
git clone https://github.com/fxtd-studios/radiance.git
cd radiance
pip install -r requirements_windows.txt
Ubuntu / Linux
Install the system libraries OpenCV needs (OpenEXR and OCIO ship as self-contained wheels):
sudo apt update
sudo apt install -y git python3-venv build-essential libgl1 libglib2.0-0 ffmpeg
On Ubuntu 22.04 the package is
libgl1-mesa-glx; on 24.04+ it'slibgl1.
Then, inside ComfyUI's environment:
cd ComfyUI/custom_nodes
git clone https://github.com/fxtd-studios/radiance.git
cd radiance
pip install -r requirements_linux.txt
WSL (Ubuntu on Windows)
WSL2 is Ubuntu with GPU passthrough, so follow the Ubuntu steps above (including requirements_linux.txt), plus:
- Install the NVIDIA driver on the Windows host only, never a Linux NVIDIA driver inside WSL. Verify with
nvidia-smiinside WSL. - No CUDA Toolkit needed: PyTorch's bundled CUDA runtime handles the GPU.
- Keep ComfyUI on the Linux filesystem (
~/ComfyUI), not/mnt/c/..., for speed; open the UI from Windows athttp://localhost:8188.
macOS (Apple Silicon)
cd ComfyUI/custom_nodes
git clone https://github.com/fxtd-studios/radiance.git
cd radiance
pip install -r requirements_mac_silicon.txt
Verify
Start ComfyUI and look for Radiance: successfully loaded 156 nodes (v3.5.0) in the log.
A lower count means a node module failed to import, usually a missing optional
dependency; the Environment Guard table printed at startup shows which.
For a full machine-level check (every node executed on your GPU, VRAM peaks, and the RUDRA SDR → HDR pixel model benchmarked and scored), run the acceptance tool. It ships with a git install, not with the registry package:
cd ComfyUI
python custom_nodes\radiance\tools\gpu_acceptance.py
It writes gpu_acceptance_report.md next to the script, and names any nodes
missing on your install.
Updating
- ComfyUI Manager / Registry: use Update on Radiance in the Manager, then restart ComfyUI.
- Git install:
git pullinComfyUI/custom_nodes/radiance, run the samepip install -r ...line as above, then restart ComfyUI.
The startup log prints the installed version:
Radiance: successfully loaded 156 nodes (v3.5.0).
Upgrading from 2.x or 3.4
3.5.0 is a large release; the full list is in the changelog. What affects an existing graph:
- Check widget values once on HDR VAE Decode, SDR → HDR Universal, SDR → HDR Recover and NDI Sender. Inputs were removed from them, and ComfyUI stores widget values by position.
- HDR is measured one way everywhere: linear 1.0 = reference white, 203 nits by default (ITU-R BT.2408). Universal and Recover output that used 1.0 = 100 nits is now 2.03x smaller in value and identical in nits.
- Learned SDR → HDR is one pixel model that downloads itself; the older
latent decoders (
rudra_turbo_decoder_*,rudra_full_decoder_*) are no longer read and can be deleted frommodels/radiance. - Multipass Relight reads
aothe way renderers write it: 1 = open. It used to read the pass as an occlusion amount, which inverted real AO loaded through Read AOVs. A hand-made occlusion mask needs inverting once. - Thirteen bug fixes change some outputs: Video HDR Decode (white on
peak_nits, a real SDR preview), Video Batch Decode (no secondlatent_scale), HDR Color Pipeline (every primaries pair, corrected D60 matrices), Multipass Relight's point light with a depth pass, Digital Cinema Read (a video's first frame), EXR MultiPart (every frame). The changelog's upgrade note lists them.
Models (RUDRA SDR → HDR)
Learned SDR → HDR recovery uses the RUDRA pixel model: a compact network that takes decoded 8-bit SDR pixels and returns scene-linear HDR, recovering clipped highlights and crushed shadows. It works on any image or frame batch and needs no VAE, so it applies equally to generated frames and to footage. The weights are published on Hugging Face, fxtdstudios/RUDRA.
The RUDRA weights are licensed for non-commercial use only, unlike Radiance's code (GPL-3.0) and RUDRA's code (Apache 2.0). One training source (HdM-HDR-2014 / HdM-HFR-2017) is free for academic use only, and FXTD Studios cannot waive that term. Research, evaluation, teaching and personal projects are fine; commercial production, client deliverables and paid services need a commercial licence from FXTD Studios. The full terms are in the weights' licence. Expand mode uses no weights and has no such restriction.
It downloads automatically. The first time SDR → HDR Universal or
SDR → HDR Recover needs the model and none is installed, Radiance fetches
RUDRA's shipped model, sdr2hdr_shadow_v1 (about 5 MB), into your ComfyUI
models folder:
ComfyUI/models/radiance/sdr2hdr_shadow_v1.safetensors
The download is pinned to a fixed Hugging Face commit and checked by size and
SHA-256 before it is used; a file that does not match is discarded. It happens
once, and the console shows [Radiance] Installed ... when it is done. Leave
the node's pixel_checkpoint field empty to use it.
To install it by hand instead (offline or air-gapped machines), download
sdr2hdr_shadow_v1.safetensors
and put it at the path above, creating the radiance folder if needed. To turn
automatic downloads off, set any of these in the ComfyUI launch environment:
| Variable | Effect |
|---|---|
RADIANCE_ALLOW_DOWNLOADS=0 |
never download any Radiance model |
HF_HUB_OFFLINE=1 or TRANSFORMERS_OFFLINE=1 |
treat the machine as offline |
Radiance registers models/radiance with ComfyUI, so a radiance: entry in
extra_model_paths.yaml works too, and RADIANCE_SDR2HDR_PIXEL can point at
a file anywhere. Every RUDRA image checkpoint loads, as Hugging Face publishes
it (.safetensors, flat in the folder or under the sdr2hdr/ subfolder
hf download creates) or as the training scripts write it (.pt); each file
carries its own architecture, so the shadow-gated and ungated models both
build correctly. When several are present sdr2hdr_shadow_v1 wins, then the
other shadow seeds, then sdr2hdr_image_v5, then older .pt files.
sdr2hdr_temporal_v1 is not an image model and is refused with a message
saying so.
| File | Used by | Link |
|---|---|---|
sdr2hdr_shadow_v1.safetensors |
SDR → HDR Universal (Recover / Hybrid) and SDR → HDR Recover, stills and frame batches | download (auto) |
sdr2hdr_shadow_s2 / _s3, sdr2hdr_image_v5 / _v6 |
alternatives: other seeds of the shipped recipe, and the backbone without the shadow gate | RUDRA/sdr2hdr |
temporal_rudra_residual_ema.safetensors |
the motion-aligned temporal model for ordered video (optional) | not yet published |
If the model can't be found or downloaded, Universal falls back to
deterministic expansion and says so in its report output; Recover raises
rather than silently expanding.
What the model recovers, and what it doesn't. In clipped highlights the
network supplies brightness; the colour stays the source's. A clipped channel
carries no information about its own value, and the released checkpoints were
trained on renders that almost never clipped, so their per-channel guesses in
blown areas are not reliable colour: letting them through drew false-colour
rings round a clipped sun and cast white areas red. The learned lift fades in
as the source goes to white (two or more channels near clip), is never darker
than the deterministic expansion, and no channel of it exceeds peak_nits,
so an HDR10 encode cannot clip it per channel. The model runs on the whole
frame when it fits in memory; pixel_tile_size only applies when it does
not, because the network normalises over its input and tiles shift the
result.
Models every other node downloads
Every node that needs a model downloads it the first time it runs. Each file
is pinned (a fixed Hugging Face commit or the original release file) and its
SHA-256 is checked before it is installed; a file that does not match is
deleted. Downloads go to a .part file and resume after an interruption, and
ComfyUI's progress bar shows them.
| Node | Model | Size | From | Installed to |
|---|---|---|---|---|
| Upscale Image / Video, Tier 1 | Real-ESRGAN x4+, x2+, x4+ anime | 18-67 MB | xinntao/Real-ESRGAN | models/upscale_models/ |
| Upscale Image / Video, Tier 2 | SwinIR-L x4 real-world GAN | 142 MB | JingyunLiang/SwinIR | models/upscale_models/ |
| Upscale Image / Video, Tier 3 | SD x4 upscaler (diffusers) | 3.5 GB | stabilityai/stable-diffusion-x4-upscaler | Hugging Face cache |
| Upscale Face Restore | CodeFormer, GFPGAN 1.4, RetinaFace | 110-377 MB | original GitHub releases | models/facerestore_models/, models/facedetection/ |
| AI Upscale | SUPIR v0F / v0Q (fp16), Real-ESRGAN | 2.7 GB each | Kijai/SUPIR_pruned | models/upscale_models/ |
| Depth Map Generator | Depth Anything V2 Small / Base / Large | 99 MB-1.3 GB | depth-anything | Hugging Face cache |
Read Models (auto_download) |
the 60 checkpoints, text encoders and VAEs in its presets (FLUX.1 / FLUX.2 / klein, SDXL, LTX-2.3 / 2.5, MiniMax-H3) | 4 MB-66 GB | pinned Hugging Face commits | the matching models/ folder |
Gated repositories. FLUX.2-dev, FLUX.2-klein 9B and LTX-2.5 require
accepting their licence on Hugging Face. Accept it on the model page, set
HF_TOKEN to a read token (or run huggingface-cli login) and restart
ComfyUI; the download then runs automatically. Without the token the node
stops with a message giving both steps.
Installed by hand. HAT-L (Upscale Tier 2) is published only on Google
Drive, so there is no pinned download: get it from the
HAT page and save it as
models/upscale_models/HAT_L_x4.pth / HAT_L_x2.pth. Until then Tier 2
uses SwinIR-L at 4x and Real-ESRGAN at 2x. SeedVR2 needs the
ComfyUI-SeedVR2_VideoUpscaler node pack, which fetches its own weights.
The latent-space RUDRA decoders that earlier releases loaded inside HDR VAE
Decode (rudra_turbo_decoder_* / rudra_full_decoder_*) were retired in
3.5.0; see the changelog. The files can be deleted from models/radiance.
Models (Multipass Estimate)
Multipass Estimate turns a plate into render-style passes using trained models only; every pass is a prediction of that quantity or is computed from one. It downloads its weights the first time it runs, pinned to fixed Hugging Face commits:
| Model | Passes | Size | Licence | Installed to |
|---|---|---|---|---|
| MoGe-2 ViT-L (Microsoft) | depth (metres), world position, normals; AO and curvature computed from them | 662 MB | MIT | models/geometry_estimation/moge_2_vitl_normal_fp16.safetensors |
| Marigold IID Appearance v1.1 (ETH Zurich) | albedo, roughness, metallic | 2.5 GB | OpenRAIL++-M | models/radiance/marigold/iid-appearance-v1-1/ |
| Marigold IID Lighting v1.1 | diffuse and specular lighting | 1.7 GB | OpenRAIL++-M | models/radiance/marigold/iid-lighting-v1-1/ |
MoGe-2 runs through ComfyUI's native MoGe support, so it needs a ComfyUI that
has the MoGe nodes; a model from Load MoGe Model can also be connected.
The Marigold licence allows commercial use with the use restrictions in its
licence.
To install by hand, download the files into the folders above. Set the node's
download_missing_models off, or RADIANCE_ALLOW_DOWNLOADS=0, to stop the
download.
What the passes are, and what they are not:
- Geometry is metric but estimated. Depth and position are in metres in
camera space (OpenGL axes, the camera looks down -z), with the field of view
recovered from the image unless you give it. Scale is the model's estimate,
usually within about 10 to 20 percent indoors. Sky and other pixels without
a surface are 0 in depth and position and 0 in
geometry_mask. - AO and curvature are computed, not guessed. AO is the GTAO integral (cosine-weighted, radius in metres) over the estimated geometry, 1 = open. Curvature is mean curvature in 1/metre, convex positive.
- Materials and lighting are learned decompositions. Diffuse and specular
lighting are scaled to the plate by a least-squares fit per frame, and the
node's
infooutput reports how closely they add back up to the beauty (about 10 percent RMS on an indoor photo). Every colour pass is scene-linear. - Motion vectors are measured with DIS optical flow: backward, in pixels, +y up.
- Video is per frame. The models see one frame at a time; a fixed seed limits flicker but does not remove it.
- Speed and memory. On a CPU a 640 px frame takes about two minutes for materials and three for geometry plus lighting, and the node needs about 8 GB of free RAM (one model is held at a time). GPU timing is still to be measured on the RTX 4080.
Example workflows
Seven workflows ship in the package's workflows folder. The first five
appear in ComfyUI's Templates browser under Radiance; any of them can also
be dragged onto the canvas. Each one was run on a clean install before release.
Pick your own file in the Read node; outputs go to
ComfyUI/output/radiance_examples/.
| Workflow | What it does | Models it needs |
|---|---|---|
sdr_to_hdr |
An 8-bit image or video to scene-linear HDR with SDR → HDR Universal, checked in the Viewer and saved as a 32-bit EXR. | The RUDRA model downloads itself (about 5 MB). |
hdr_vae_encode_decode |
Carries a linear HDR plate through a VAE with VAE Encode (HDR) and VAE Decode (HDR), and compares the result with the original in the Viewer. | The VAE your model uses, in models/vae. |
multipass_relight |
Multipass Estimate to a multilayer EXR of passes, and a point-light relight of the plate. | MoGe-2 and Marigold IID download themselves on first run (about 4.9 GB). |
colour_grade |
White Balance, Grade and an ASC CDL, checked in the Viewer and saved as a 16-bit TIFF. | None. |
hdr_delivery |
One scene-linear master to an EXR archive, a tagged HDR10 (PQ, Rec.2020) H.265 file and an ACES 2.0 SDR H.264 file. | None. |
workflows/start.json |
The quick start: Radiance Loader, Cinematic Prompt, Resolution, Sampler Pro, HDR VAE Decode and the viewers wired end to end for FLUX.1-dev. | flux1-dev.safetensors and ae.safetensors from the same page (accept the licence first) in models/diffusion_models and models/vae; clip_l.safetensors and t5xxl_fp16.safetensors in models/text_encoders |
workflows/official/wan22_t2v_hdr_universal.json |
Wan 2.2 text-to-video through SDR → HDR Universal to an HDR master with HDR Encode and Write. | wan2.2_t2v_high_noise_14B_fp8_scaled and wan2.2_t2v_low_noise_14B_fp8_scaled in models/diffusion_models; umt5_xxl_fp8_e4m3fn_scaled in models/text_encoders; wan_2.1_vae in models/vae. The RUDRA model downloads itself. |