1 The idea
A triangle on the xy diagram shows hue and saturation but not brightness. Raise luminance Y as the height and each space’s RGB cube becomes a tent-like shape whose peak is its white. The roof slopes down from white towards the primaries, so a saturated colour can never be as bright as white (blue and red sit lowest).
This neon card was built in ACEScg. White dots are colours inside ACEScg but outside the sRGB volume; red dots have left ACEScg too (a negative value). Our desert plate sits comfortably inside sRGB.
x = X / (X + Y + Z), y = Y / (X + Y + Z), height = Y2 Hands-on
Task: push saturation until at least 15% of the neon card leaves sRGB while no more than 0.5% leaves ACEScg
The window is narrow: move 0.01 at a time and watch for red dots
3 Deep dive
From an RGB cube to a tent in xyY
Every RGB space is its own cube. Go through XYZ and draw x, y on the floor with Y as the height: the three edges from black become upright posts at the three primaries, the walls where one channel is 0 stand on the triangle’s edges, and the three faces where one channel is 1 become a roof meeting at white.
The familiar triangle is just this shape’s shadow on the floor.
| Height of each primary (Y) | |
|---|---|
| sRGB R / G / B | 0.213 / 0.715 / 0.072 |
| ACEScg R / G / B | 0.272 / 0.674 / 0.054 |
Negative values are colours outside the shape
Pure ACEScg green (0, 1, 0) becomes about (−0.62, 1.14, −0.13) in sRGB. The negatives say the colour lies outside the sRGB volume; an sRGB screen can’t show it, so it has to be clipped or squeezed in.
The other way, pure sRGB red becomes about (0.61, 0.07, 0.02) in ACEScg, with no negatives, because sRGB sits entirely inside ACEScg. The numbers in this section come from a real conversion that includes white-point adaptation (see CS5); the figure’s white and red dots skip that step so they can be compared directly with the drawn shapes.
A negative in the working space (the space the maths happens in, e.g. ACEScg; see CS4) isn’t always a bug; sometimes it is a colour wider than that space
What actually escapes
Our desert plate barely leaves sRGB even at saturation 2 (about 0.01% of its dots). What usually escapes is very pure light: neon, lasers, saturated LEDs and CG with extreme colour values. When you meet these, find where the negatives are before grading further.
- 1Find the extreme colours
- 2Check for negatives
- 3Decide: clip, compress or keep
Squeezing colours in gently
Simply clipping negatives creates hard edges and hue shifts. ACES 1.3 added Reference Gamut Compression to pull escaped colours back in softly, and the ACES 2.0 output transform (the transform for looking and delivering; see CS4) has gamut handling built in. Agree with the team which one the show uses.
4 In real work
In Nuke
- Colorspace or OCIOColorSpace: convert ACEScg → linear sRGB and sample for negatives.
- Expression: build a mask where min(r, g, b) < 0 to see where colours escape.
- Saturation or ColorCorrect: reduce saturation just where it escapes, through that mask.
- PositionToPoints: plot the image’s XYZ or xyY values as a cloud to compare with a gamut.
Common mistakes → the fix
- ✗ Clamping every negative in the frame to “clean it up”✓ First find whether the negatives come from gamut or from a filter, then treat them locally.
- ✗ Checking only the xy triangle and calling a colour in gamut✓ A colour has to be inside the volume, not just the triangle: at the same chromaticity it can be too bright for a display’s 0–1 range. In a scene-linear working space such as ACEScg, values above 1 are fine; negatives are what say a colour is out of gamut.
- ✗ Pushing saturation in ACEScg and judging only on an sRGB screen✓ Colours outside sRGB are clipped on that screen, so different values can look identical; check the numbers, or desaturate to see whether they really differ.
Before you send the shot
- You know whether the shot’s extreme colours are inside the working space
- Any remaining negatives are understood and intended
- The team agrees on gamut compression
5 Check yourself
Why can’t the most saturated colours reach the height of white?
🔒 Answer the question above and this card opens
1. ACEScg (0, 1, 0) converts to sRGB with a negative red. What does that mean?
2. Why does a vivid yellow sit higher in the shape than a vivid blue?
Where the numbers come from: Colour maths comes from src/figures/colormath.ts (sRGB IEC 61966-2-1, ARRI LogC3 EI 800, sRGB/P3/Rec.2020/ACES AP1 primaries and Bradford, checked against reference numbers). xyY uses the standard CIE formulas; the horseshoe is the CIE 1931 2° locus, sampled. The neon card is our own procedural image (HSV inside ACEScg). Saturation here pivots on AP1 luminance (0.272/0.674/0.054), not Rec.709 luma. “Outside sRGB” is judged on the absolute colour without white-point adaptation, so it can be compared directly with the drawn shapes. A real ACEScg → sRGB conversion also adapts the white (see CS5), so a few borderline dots may be judged differently in Nuke. Measured: the goal passes from about 1.06 to 1.15 (15% is reached near 1.06; more than 0.5% leaves ACEScg from about 1.16).