1 The idea
These sparks are a light element: the cores reach about 62 (far above 1) and alpha is 0, like a real fire element. Light in the real world adds up, so plus keeps all of it.
Nuke’s screen uses A + B − AB only while values stay between 0 and 1. Above 1 it returns max(A, B), so the brightest light is not added to the plate. Probe the soft edge of a spark, around the core.
plus: A + B · screen (Nuke): A + B − AB if A, B in 0–1, else max(A, B)2 Hands-on in the mini compositor
Task: change the operation so the light adds onto the plate in full
Drop the Viewer gain to about 0.1 to see where light goes missing
3 Deep dive
Light only adds
Two lamps on one wall give the sum of both. Sparks, fire, glows, flares and CG light groups therefore use plus = A + B, which keeps all of the light energy.
Plus does not care about order: A + B = B + A. Stack several light elements in any order and you get the same result.
What screen does to HDR values
The numbers below were measured in Nuke. Once either input passes 1, screen just returns the larger one, and the plate’s light under the spark is thrown away.
| A (light) | B (plate) | plus | screen |
|---|---|---|---|
| 0.8 | 0.6 | 1.4 | 0.92 |
| 2.0 | 0.5 | 2.5 | 2.0 |
| 1.5 | 1.2 | 2.7 | 1.5 |
Overlay, soft-light and color-dodge also break above 1; keep them away from linear images
Dialling a light element
Too strong? Turn it down on its own branch before the merge with a Grade multiply, which can also tint it. Or use the Merge mix knob: out = B + mix·(op − B), so plus at mix 0.5 gives B + 0.5·A.
Do not tame light by switching to screen: it does not just reduce, it throws energy away.
- 1Read sparks
- 2Grade (multiply, tint)
- 3Merge plus (A)
- 4Plate (B)
Light or matter
Before merging, ask: does this element give off light or block it? Light goes on with plus. Things that block light, such as smoke, dust or snow, go over with a real alpha.
| Element | Merge | Why |
|---|---|---|
| Sparks, glow | plus | Pure light |
| CG light groups | plus | They sum back to the beauty |
| Smoke, dust | over | Blocks the background |
| Snow | over | Solid flakes, not light |
4 In real work
In Nuke
- Read sparks (EXR, linear, alpha 0) → Grade (multiply for strength and tint)
- Merge, operation plus: sparks into A, plate into B
- Several lights: chain Merge plus nodes; the order does not matter
- Reduce strength with the Grade multiply or the Merge mix, not with screen
- Check with the Viewer gain near 0.1: the cores must still read brighter than the plate
Common mistakes → the fix
- ✗ Using screen for HDR sparks✓ Above 1 it returns max(A, B) and light goes missing. Use plus.
- ✗ Saving a light element as an 8-bit PNG/JPG✓ 8-bit files clip at 1 and the cores go flat. Keep it as float EXR.
- ✗ Plussing smoke onto the plate✓ The smoke glows like light. Put it over with its alpha.
- ✗ Turning on (un)premult by in a Grade on sparks with alpha 0✓ In Nuke, alpha-0 pixels come out 0 in every channel, so the sparks vanish. Leave it off (see F4).
Before you send the shot
- Every light element goes in with plus
- No screen, overlay or soft-light on values above 1
- Light elements are float, not clipped at 1
- With the Viewer gain down, the cores still hold
5 Check yourself
A fire/spark element with alpha = 0 merged with over gives the same result as…
🔒 Answer the question above and this card opens
1. In Nuke, screen with A = 2.0 and B = 0.5 gives…
2. The sparks are too strong. Where do you fix it?
Where the numbers come from: Merge, Grade, Premult and Unpremult here match Nuke 17.0v2 in all 109 test cases (numbers sampled from real Nuke). Blur and Transform are simplified: close, not identical to Nuke. All images are Blender renders of our own scene: a code-built layout with hills made as Gaea 2.3 terrains (Community edition, built headless), a Poly Haven CC0 HDRI sky, Poly Haven (CC0) rocks and dry grass, Quixel sand and cliff textures, and a robot on a Mixamo rig (Quixel and Mixamo are used in the renders only; no source files ship).