Halation
Halation from the physics up
- image
- image
That red-orange halo around streetlights in night shots - the Cinestill 800T signature - isn't a glow filter. It's physics: light hits the film, passes through the base, reflects off the back surface, and re-exposes the emulsion in a ring around the source. Because the red-sensitive layer sits deepest in the stack, the bounced light comes back red. Halation simulates exactly that, which is why it looks right where every "bloom" plug-in looks fake.
It's part of ComfyUI-Darkroom's film-emulation group, and the derivation doc is a great read if you're into it: the node models the ring geometry with total-internal-reflection cutoff and a diffuse tail, done as an FFT convolution, with the red-dominant channel ordering derived rather than guessed. It adds colored exposure in linear light - the hue shift is the look.
How it works
Darkroom extracts the highlights above a luminance threshold, blurs them with a physically-motivated point-spread function, tints by channel (red most, green some, blue least), and adds the result back onto the image. The default tint (1.0, 0.4, 0.15) is the classic red-orange film base. There are two blur models: gaussian (fast, close enough for most work) and disk (physically accurate ring, slower). The presets handle the rest - "Cinestill 800T" is the heavy night-halo look, "Subtle" and "Standard" are gentler day-time characters.
The inputs that matter
- preset - Subtle, Standard, Cinestill 800T, or Custom.
- strength - overall intensity (default 0.3). Halation is easy to overdo; 0.3 is a sane starting point.
- threshold - the luminance level that counts as a "highlight" (0.3–1, default 0.75). Lower it and more of the image glows.
- radius - how far the glow spreads (5–100, default 25).
- tint_r / tint_g / tint_b - the channel weights. Push blue up and you get a colder, more video-y halo; leave the defaults for film.
- blur_type - gaussian or disk.
Output is image, same size in and out.
Install and gotchas
cd ComfyUI/custom_nodes
git clone https://github.com/jeremieLouvaert/ComfyUI-Darkroom
pip install -r ComfyUI-Darkroom/requirements.txt
Or search "Darkroom" in ComfyUI Manager and restart. It's under AKURATE/Darkroom/Film.
The standard mistake is treating halation like a bloom effect and cranking it on every frame. It's a night-and-neon effect - on a bright daylight scene, threshold 0.75 and strength 0.3 does almost nothing, and that's correct. Save the Cinestill preset for scenes with actual light sources. And like all spatial effects in this pack, halation can't go inside a LUT bake chain - apply it after Extract. If you're chasing the photorealism trick where "Cinestill 800T for night halation" makes an AI image read as shot, this is the node that does that without the model having to guess it.
Inputs (11)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| presetopt | COMBO | CineStill 800T | Halo channel weights (w_R/w_G/w_B). 'Custom' uses halo_r/g/b below |
| strengthopt | FLOAT | 0.350–1 | Halation intensity, maps 0-1 UI to 0-0.25 physical energy fraction. 0 = early-exit passthrough |
| ring_radiusopt | FLOAT | 8.03–60 | TIR ring radius r_c, ref-px @1024 long edge (film-base-thickness stand-in, no-microns rule) |
| tail_lengthopt | FLOAT | 405–200 | Diffuse multiple-scattering tail spread L, ref-px @1024 long edge |
| ring_tail_balanceopt | FLOAT | 0.650–1 | Mix between the TIR ring (1.0) and the diffuse tail (0.0) |
| ah_strengthopt | FLOAT | 0.000–1 | Anti-halation layer. Halo energy scales by (1-ah)^2. 0 = remjet removed (CineStill), 1 = modern stock, halo dead |
| halo_ropt | FLOAT | 1.000–1 | Red halo channel weight (preset=Custom only) |
| halo_gopt | FLOAT | 0.320–1 | Green halo channel weight (preset=Custom only) |
| halo_bopt | FLOAT | 0.100–1 | Blue halo channel weight (preset=Custom only) |
| highlight_kneeopt | FLOAT | 0.000–0.95 | Isolate bright sources before halating (taste). 0 = fully physical, all light halates |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |