1 The idea
Saturation pulls colour towards the pixel’s brightness (luma). 0 = black and white, 1 = unchanged, above 1 = stronger colour. Eyes are most sensitive to green, so the Rec.709 weights give green 0.7152.
Push saturation very high and the smallest channel goes negative, a value no screen can show. Watch for it when boosting colour.
L = 0.2126 r + 0.7152 g + 0.0722 b · out = L + s · (x − L)2 Hands-on in the mini compositor
Task: make the plate black and white with the brightness unchanged
3 Deep dive
One formula for less and more colour
Saturation first works out the pixel’s luma, then slides each channel along a straight line between its own value and the grey with the same luma. s = 0 stops at the grey, s = 1 is the original, and s above 1 carries on past the original.
Take a blue-sky pixel from the desert plate, (0.12, 0.18, 0.26). Its luma is 0.173, and for every s in the table the luma stays 0.173, because the three weights add up to exactly 1.
| s | r | g | b |
|---|---|---|---|
| 0 | 0.173 | 0.173 | 0.173 |
| 0.5 | 0.147 | 0.177 | 0.217 |
| 1 (original) | 0.12 | 0.18 | 0.26 |
| 2 | 0.067 | 0.187 | 0.347 |
| 3.5 | −0.013 | 0.197 | 0.477 |
Why luma and not the average
A blue LED on the CG robot, (0.05, 0.1, 1.0), looks fairly dark to the eye because we are not very sensitive to blue. Its luma is 0.154, but the plain average is 0.383. Desaturate with the average and that deep blue light turns into a pale grey that is far too bright.
The weights 0.2126 / 0.7152 / 0.0722 belong to Rec.709 and sRGB primaries. If the working space is ACEScg the weights are different (green is still the heaviest), so match what the pipeline uses.
Same luma doesn’t mean the eye sees exactly the same brightness. Very strong colours often look a touch brighter; judge by eye too.
Where colour turns negative
As s rises, the smallest channel is pushed further below the luma until it crosses 0. It crosses at s = L ÷ (L − smallest channel); the sample sky crosses at about s = 3.26.
Colours that are already strong, like LEDs, HDR sparks or neon signs, have a smallest channel close to 0 already, so they go negative much sooner. The robot’s blue LED, (0.05, 0.1, 1.0), crosses 0 at only s ≈ 1.5.
- 1Push saturation
- 2Smallest channel below 0
- 3Screen shows it as black
- 4Later merges and grades go wrong
Saturation in real shots
Low light means low colour. In a night shot or in shadow, CG that is more saturated than the plate looks pasted on at once. If you want colour, let it come from small light sources such as the robot’s lights, not the whole body.
A check: hang a Saturation of about 3 on a viewing-only branch. Colours that don’t belong jump out, such as leftover green edges or CG with a different tint from the plate. Rest your eyes for a moment afterwards before judging colour.
In Rec 709 mode the formula is a 3×3 matrix, so it gives the same result before or after premult. The maximum mode, pushed above 1, drives values negative far harder and sooner, so always probe for negatives after boosting with it.
4 In real work
In Nuke
- Saturation: set saturation and check that luminance math is Rec 709 (the default)
- Black-and-white check: Saturation = 0 on a separate branch, view it, never connect it to the Write
- Saturation test: a Saturation of about 3 on a viewing-only branch to find colours that don’t belong
- Use the Saturation mask input to limit the area, for example to desaturate only the shadow under the robot
- After a big boost: an Expression with alpha = r<0 || g<0 || b<0 to find negative pixels (see C9)
Common mistakes → the fix
- ✗ Making black and white with the average or the maximum mode✓ Use Rec 709 (or the working space’s weights) so the brightness the eye sees is kept
- ✗ Boosting HDR sparks until the blue channel goes negative✓ Boost a little, or add colour with a per-channel Grade gain instead, then probe for negatives
- ✗ Leaving the Saturation test at 3 connected so it ends up in the delivery✓ Keep check nodes on the Viewer branch only, with a clear name
- ✗ Boosting CG colour in a low-light shot “to make it pop”✓ Match the plate’s saturation and let colour come from small light sources instead
Before you send the shot
- Luminance math matches the working space
- No negative pixels after boosting (probe the strongest colours)
- The saturation test shows no stray colours in the CG or key edges
- CG in shadow is no more saturated than the plate
- All check nodes sit off the branch that feeds the Write
5 Check yourself
Why does the luma formula weight green the most?
🔒 Answer the question above and this card opens
1. A pixel (0.2, 0.35, 0.6) goes through Saturation (Rec 709) at 2. What is the luma of the result?
2. Desaturating with the average (r+g+b)/3 turns the robot’s blue LED into pale grey. Why?
Where the numbers come from: Computed in your browser. Saturation, Multiply, Clamp, Invert, Keymix, Copy and Grade match Nuke 17.0v2 (checked). Blur, Defocus, Glow, Sharpen, ChromaticAberration, Vignette, LensDistort, Grain, Erode, Toe, the Keyer and Despill are teaching versions, not identical to Nuke’s nodes. Transform here is also a teaching version: bilinear filtering, no concatenation, cropped at the frame edge. Images are our own Blender renders (the green screen is fully code-built; the desert scene uses Gaea 2.3 hills, a Poly Haven CC0 HDRI sky, Poly Haven CC0 rocks and grass, Quixel sand and cliff textures and a Mixamo rig for the robot, with Quixel and Mixamo used in the renders only).