ACES 2 in Game Engines: Variable reference/max luminance

I understand now that documentation is on the way to address how to implement this sort of behaviour correctly. Please don’t rush! I believe that you have other important deadlines coming up that most definitely take priority :slight_smile:

Here is a bit more detail on the APIs that I’m working with: Use DirectX with Advanced Color on high/standard dynamic range displays - Win32 apps | Microsoft Learn.

So let’s say Windows is operating with an HDR display and a 200 nit “SDR reference white level”, which is a reasonable value, according to my personal setup, the BT.2408 recommendation, and the Microsoft documentation.

If my game is only outputting SDR, this means the value sent to the display will be as follows:

  1. linear scene referred → nonlinear ACES (via ACES ODT)
  2. nonlinear ACES → nonlinear sRGB (via piecewise sRGB EOTF)
  3. nonlinear sRGB → nonlinear ACES (via the inverse piecewise sRGB EOTF)
  4. nonlinear ACES → scaled nonlinear ACES (multiplied by “SDR reference white level”)
  5. scaled nonlinear ACES → PQ signal (or equivalent HDR EOTF)

So if we take this example of a 200 nit “SDR reference white level” and look at an 18% scene referred value, it would look something like this:

  1. 0.18 → approximately 0.10 (or 10 nits) [nonlinear ACES]
  2. 0.100.38 [nonlinear sRGB]
  3. 0.380.10 [nonlinear ACES]
  4. 0.1020 nits [scaled nonlinear ACES]
  5. 20 nits → output via PQ or equivalent HDR EOTF

From my personal experience, this provides an image on an HDR display that looks similar to the image I would see on the same display when it is operating in SDR mode. Additionally, this scaling based on the “SDR reference white level” is entirely handled by the operating system and is outside of the control of the developer in the case of an SDR app.

From the meeting recording, I understand that in HDR, the ACES ODT will usually map 18% scene referred to around 15 nits instead of 10 because of the higher dynamic range.

With the goal of using ACES to produce a similar appearance on both SDR and HDR displays, I would expect that a video game that is rendering 18% scene referred would provide an HDR output value of around 30 nits when used with a 200 nit “SDR reference white level”. (Or 15 nits with 100 nit white, or 22.5 nit for 150 nit white, or 37.5 nit for 250 nit white, etc.) And, of course, this has an impact on the maximum luminance because the low end has been scaled upwards.

When writing your documentation, I would be interested to know how to correctly configure ACES to work with this sort of OS-controlled variable “SDR reference white level” and maximum luminance, but again, no rush! Of course, it’s entirely possible that I am mistaken in my understanding of how things work and what is most desirable with real-world consumer hardware/operating systems. I am quite new to this, after all.