Understanding the sRGB RRT/ODT

A 1.0 in ACES or ACEScg is not meant to map to a 1.0 in an output encoding such as sRGB.

ACEScg [1.0] -> RRT -> sRGB ODT -> sRGB [0.812]

The reason ACEScg [1,1,1] becomes sRGB [0.8,0.8,0.8] is because it is being rendered from scene-referred encoding to an output referred encoding. It uses an S-shape curve and so, as in most imaging systems trying to make a reproduction of a scene in a different viewing environment, a 100% reflector (1.0) in the scene does not map to 100% output (1.0) on a display. This is because the S-shape curve compresses highlights to allow headroom for “over-brights”.

In SDR renderings via ACES, such as to sRGB, an sRGB output value of 1.0 corresponds to about 16.0 in scene space, which is +4 stops above 100% in the scene. (Those 4 stops get compressed into the output range 0.8-1.0)

If you want output-referred imagery to get into ACES, then you need to use an inverse ODT followed by the inverse RRT. If you go: sRGB [1.0] -> InvODT -> InvRRT -> ACEScg [16.292]
Then you can work in ACES/ACEScg and render back out to display using the forward RRT/sRGB ODT.

1 Like