As described in the Oculus Device Specifications, all Oculus HMDs use a different color space. This guide describes color management used to avoid issues with low-level banding, hue shift, and under- or over-saturation. This guide also reviews the standard color spaces supported by Oculus HMD.
Once you’ve mastered your app to a color space, you can use the ColorSpace APIs provided in our SDK and Integrations to identify the color space you’ve mastered. The Oculus runtime will remap the color space to present the content as closely as possible to the mastered color and brightness.
The ColorSpace API only handles color-space remapping. Unless specified, all color spaces use D65 white point. The API will not affect brightness, contrast, or gamma curves. Some of these aspects are handled by the texture format being used. From the GPU sampler perspective each texture will continue to be treated as linear luminance, including the sRGB format which is converted to linear by the texture sampler.
Before introducing the device and standard color spaces that Oculus HMDs support, it is important to understand the components of the color spaces. There are a number of resources that introduce these components, such as https://en.wikipedia.org/wiki/Color_space.
The Oculus Go and Rift S’ LCD limitations prevent them from meaningfully differentiating brightness levels below 13 out of 255 for 8-bit sRGB or 0.0015 out of 1.0 max for linear-RGB shader output values. If a VR app uses an extensive amount of these dark ranges, it is recommended to author content in a higher brightness range as much as possible.
We recommend app developers to master all of their applications for the Oculus Rift and Rift S to the Rift CV1 color space on an Oculus Rift CV1, Rec.2020 color space for Oculus Quest, and Rec.709 color space for Oculus Go. The OLED display has a wider color gamut than the LCD and allows for richer visual experiences. VR apps authored for the Oculus Go and Rift S color spaces tend to have dull or washed out colors when viewed on the Oculus Quest and Rift CV1 displays.
Requested rectilinear-mirror outputs are composited without any color space adjustment. However, if a client requests a post-distortion (i.e. non-rectilinear) mirror output, it will be provided with the same color adjustment that was applied for the HMD output. Post-distortion mirror may not have acceptable color-space accuracy when viewing on desktop.
The following standard color spaces are supported in addition to the Oculus color spaces identified in Oculus Device Specifications.
Rec.2020 is a wide color gamut commonly used by HDR UHD TVs. It covers almost all of the colors the human eye can perceive. It looks like this:
Color gamut graph from: https://commons.wikimedia.org/wiki/File:CIExy1931_Rec_2020.svg
Rec.709 is a narrow color gamut used in almost all internet and non-HDR content. It is the default color gamut used in the sRGB standard and is commonly used by LCD panels. It looks like this:
Color gamut graph from: https://commons.wikimedia.org/wiki/File:CIExy1931_Rec_709.svg
DCI-P3 is a color gamut that’s significantly wider than Rec.709, but slightly narrower than Rec.2020. It isn’t very common outside of film projectors, but it’s very close to the native color primaries of the OLED Rift CV1 and Oculus Quest panels. Unlike the standard DCI-P3 color space, where the white point is D65, Rift CV1 and Quest use a D75 white point. DCI-P3 normally looks like this: \
Color gamut graph from: https://commons.wikimedia.org/wiki/File:DCI-P3_D65.svg
Adobe RGB is a color gamut between DCI-P3 and Rec.2020. It is somewhat close to the color primaries of the OLED panels in Rift CV1 and Oculus Quest. It looks like this:
Color gamut graph from: https://commons.wikimedia.org/wiki/File:CIExy1931_AdobeRGB.png