Home · Lab · Lens Artifacts (Advanced)

LA3 Halation: add only what spreads

max(0, spread − original), and roto out red lights

Lens Artifacts (Advanced) · ~8 min · Free

1 The idea

On film, very bright light goes through the light-sensitive layers, bounces off the film base and comes back up, leaving a red-orange glow around blown highlights, mostly where very bright meets dark. This lab spreads red the widest, green less, blue least, so the warm colour appears on its own from the different sizes.

Three traps: add the whole spread image and the core gets brighter again; subtract the original without a clamp and the core gets a dark hole; and a light that is already red just gets redder. Watch the numbers on the robot’s visor core and on the red lamp, and switch to “Added only ×3” to see what goes in (boosted 3×; negative values show as bright too).

out = img + amount · max(0, spread(key·img) − key·img)

2 Hands-on

Task: make the halation add only the light that spreads out, with the visor core unchanged and no doubled red on the lamp

It takes all three: minus, clamp and roto

SkyVFX Lab · LA3interactive · 1001

3 Deep dive

Where halation forms, and why it isn’t plain glow

Halation doesn’t form in the lens but in the film. Very bright light goes through the light-sensitive layers to the film base and reflects back; the first layer it hits on the way back is the red-sensitive one, so the rim is red-orange, strongest where blown highlights meet dark areas. Modern stocks have an anti-halation layer, so they show less than old ones.

Digital bloom is white-ish, not red. On a digital show halation is a chosen look, so check the reference to see whether it’s wanted.

HalationBloom / glow
Forms inFilm (reflection off the base)Lens / sensor
ColourRed-orange, red widestThe light’s colour, whitish
WhereBlown edges against darkAll around highlights

The maths that keeps the core clean

A spread image keeps the same energy but moves it outward, so at the core it is lower than the original and around it higher. What we want to add is only what spilled out: spread − original, with the negatives cut off. In the lab: without the subtraction the visor core goes up +12.0%; subtract without a clamp and it drops −52%; subtract and clamp and it doesn’t change at all.

An advanced option: spread with a kernel measured from a real lens (a PSF) and add a little extra to its centre pixel (kernel = PSF + a single dot). Part of the sharp image then passes straight through, keeping the cores crisper against the glow.

  1. 1Key the blown highlights
  2. 2Spread (red widest)
  3. 3Subtract the original
  4. 4Clamp ≥ 0
  5. 5Merge plus

Lights that are already red, and when not to add it

Tail lights, red warning lamps, anything already deep red: leave them in the key and they get red on red, far too much. Roto them out of the key before the spread. In the lab the red lamp gains +33% red until you roto it out.

Halation appears only where highlights truly blow out, not on every shot or every light. Look at reference from the camera or stock first, then add the least that still reads.

The whole recipe in one line: key the blown highlights, take the red lights out of the key, spread, take the original away, keep only what is above 0, and add that on top, so the cores stay as they were

4 In real work

In Nuke

  1. Keyer (luminance) on the blown highlights only, with the range pushed above 1, then Premult.
  2. Blur per channel (red largest, green medium, blue small), or Convolve with a lens kernel.
  3. Merge operation minus = A − B (checked in Nuke 17): the spread image into A, the keyed original into B.
  4. Clamp with a minimum of 0 (and a generous maximum such as 10 against spikes), then Merge plus over the comp.
  5. Roto already-red lights out of the key, and place halation after CA (chromatic aberration) and before grain (see LA7 for the full camera stack).

Common mistakes → the fix

  • ✗ Adding the whole spread image✓ Add only max(0, spread − original) so the core isn’t brightened twice.
  • ✗ Subtracting the original but forgetting the clamp✓ Negatives eat dark holes and odd fringes into the core. Always clamp at a minimum of 0.
  • ✗ Halation on red lights✓ Roto them out of the key, or the red doubles.
  • ✗ Putting it on every shot as a house look✓ Add it when highlights really blow out and the reference shows it.

Before you send the shot

  • Light cores unchanged before vs after (sample them)
  • The rim is red-orange, red the widest
  • No negatives after the merge (sample the pixels)
  • Already-red lights are rotoed out
  • Sits after CA, before grain

5 Check yourself

One question to check yourself

Why clamp at 0 after subtracting the original?

What you learned

🔒 Answer the question above and this card opens

More questions

1. After adding halation, the visor core went from 1.82 to 2.04. What does that tell you?

2. Why does the red channel get the largest spread?

Where the numbers come from: Adding only the spread (subtract the original, then clamp at a minimum of 0) and rotoing out red lights come from KB 159 and 153 (node graphs read in Nuke 17). The 1 : 0.45 : 0.2 spread and the tint are our teaching values, not any gizmo’s. Blurs are three box passes (close to Gaussian) at half resolution; the key uses Rec.709 luma from 1 to 2. The red lamp is built in code.