◎ Radiance Highlight Synthesis
Radiance Highlight Synthesis — fake the roll-off that flat white skies deserve
- image
- image
Nothing screams "AI image" faster than a clipped, featureless white sky. Real film and camera footage roll off softly into highlights - the brightest areas still carry texture, grain, a hint of structure. Diffusion models hit pure white and stop, because there's nothing in the training distribution past it. Radiance Highlight Synthesis is the fix: it takes the blown-out regions above a threshold and synthesizes plausible detail into them, the way a film scan retains texture where an 8-bit JPEG just clips.
The node is upfront about what it does, and the source docstring is honest about the word for it: it "hallucinates" detail in blown-out areas. This is not recovery - the pack's own README is explicit that it can't recover detail that was already clipped. It's synthesis: inventing grain and structure that reads as natural roll-off instead of flat white. For the "AI look" problem specifically, this is one of the cheapest single moves you can make.
How it works
Three stages, per the source: expand the dynamic range with a roll-off curve so values above the threshold push past 1.0; generate synthetic grain/texture tuned to the image's own statistics; then blend that detail into the expanded highlights so the result behaves like film clipping rather than a hard cut. The blend_mode - Screen, Add, or Soft Light - controls how the synthetic texture interacts with the base. Screen is the gentle default; Add is punchier; Soft Light is subtlest.
The seed input matters because the grain is generated, not computed. Same settings, different seed, different texture - which is exactly what you want when iterating on a shot, and exactly what you don't want if you're trying to match grain across a sequence. Lock the seed for consistency.
The inputs that matter
threshold- the luminance level above which synthesis kicks in. Default 0.95 means "only the top of the range"; drop it to 0.5 to treat everything brighter than mid-gray as a highlight.expansion- how far to push values above 1.0. 1.5 default is a gentle extension; 4.0 is a dramatic HDR push.detail_amount- strength of the synthetic grain in the highlights. 0.2 is subtle; past ~0.6 it starts to read as noise.detail_scale- the frequency of the texture. Low = fine grain, high = soft clouds of detail.blend_modeandseed- the flavor and the reproducibility knob.
Output: a single image.
Why you'd reach for it
Two situations, both common. The everyday one: a generation with a blown sky or a hot light source that looks dead. Run it through with defaults and the top of the frame gets back its texture. The pipeline one: you're doing HDR-style work and need values past 1.0 in the highlights - expansion pushes the range out so downstream tone mapping or EXR output has something to work with. The community's read on this pack is that it "won't create real 16/32-bit EXR" unless your input has the data - this node is precisely the tool that creates plausible data where the source has none, but keep expectations honest: it's simulated detail, not recovered signal.
Installing
cd ComfyUI/custom_nodes
git clone https://github.com/fxtdstudios/radiance.git
cd radiance
pip install -r requirements.txt # or requirements_windows.txt / requirements_linux.txt / requirements_mac_silicon.txt
Or search Radiance in ComfyUI Manager, restart. Linux needs libopenexr-dev first.
Gotchas
The tuning trap is over-expansion: push expansion too far and your "film roll-off" turns into an obvious gray fog in the highlights, because you've stretched noise into brightness. Work from the defaults, judge at 100% zoom, and only then raise detail_amount. Second, if your image has no clipped highlights - nothing above threshold - the node does almost nothing, which reads as "broken." Check your histogram first. Third, remember it's seeded: for a sequence, lock seed or your grain will crawl between frames.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| threshold | FLOAT | 0.950.5–1 | Luminance level above which to synthesize detail. |
| expansion | FLOAT | 1.51–4 | How much to expand highlight range (multiplier for values > 1.0). |
| detail_amount | FLOAT | 0.200–1 | Strength of synthetic grain in highlights. |
| detail_scale | FLOAT | 1.00.1–5 | Scale/frequency of the synthetic detail. |
| blend_mode | COMBO | Screen | 3 options: Screen, Add, Soft Light |
| seed | INT | 00–18446744073709550000 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |