Advanced Rendering on the Oculus Quest

Important

All Oculus Quest developers MUST PASS the concept review prior to gaining publishing access to the Quest Store and additional resources. Submit a concept document for review as early in your Quest application development cycle as possible. For additional information and context, please see Submitting Your App to the Oculus Quest Store.

This section describes advanced rendering features available for the Oculus Quest.

Fixed Foveated Rendering

Fixed Foveated Rendering (FFR) renders the edges of your eye textures at a lower resolution than the center. The effect, which is nearly imperceptible, lowers the fidelity of the scene in the viewer’s peripheral vision. This reduces the GPU load as a result of the reduction in pixel shading requirements. FFR can dramatically increase performance, improving the image show in the headset. Complex fragment shaders also benefit from this form of multi-resolution rendering.

Unlike some other forms of foveation technologies, Oculus Quest’s foveation is not based on eye tracking. The high-resolution pixels are fixed in the center of the eye texture.

Implementing Fixed Foveated Rendering

To use FFR, call the following to set the degree of foveation -

OVRManager.FixedFoveatedRenderingLevel = OVRManager.FixedFoveatedRenderingLevel.{LMSHigh};

Where level can be Off, LMSLow, LMSMedium, LMSHigh.

  • Off disables multi-resolution
  • LMSLow is the low FFR setting
  • LMSMedium is the mid FFR setting
  • LMSHigh is the high FFR setting
  • LMSHighTop is the high top FFR setting

These values set the degree of foveation. The images below demonstrate the degree to which the resolution will be affected.

LMSLow FFR Setting

LMSMedium FFR Setting

LMSHigh FFR Setting

LMSHighTop FFR Setting

In the images above, the white areas at the center of our FOV, the resolution is native: every pixel of the texture will be computed independently by the GPU. However, in the red areas, only 1/2 of the pixels will be calculated, 1/4 for the green areas, 1/8 for the blue areas, and 1/16 for the magenta tiles. The missing pixels will be interpolated from the calculated pixels at resolve time, when the GPU stores the result of its computation in general memory.

Fixed Foveated Rendering Best Practices

Generally, apps should not use FFR as solution for performance, this may have have a very noticeable impact on visuals. These are some tips on better tuning the FFR settings in game based on internal feedback and testing:

  1. FFR levels can be changed on a per-frame basis and should be changed according to the content being displayed. In cases where the player may need to look to the sides of the field of view more often, if high frequency content such as text is introduced, or if performance requirements change, the FFR level should be changed to match the situation. Starting a new level, opening/closing menus, and entering new map areas are generally good points to consider changing the FFR setting. However, avoid changing FFR levels frequently within the same scene without another transition as the jump between FFR levels can be fairly noticeable.

  2. Foveation is more apparent and noticeable in bright/high contrast scenes, and with higher frequency content such as text. In darker/low contrast scenes, the high foveation setting may result in a reasonable visual quality while that may not be the case in a brighter/higher contrast scene. This can play into what foveation level can be used for certain scenes in a game, and should be used in conjunction with the ability to change FFR levels per-frame. Medium should be a suitable FFR level in most cases, but low is a good option if there is performance to spare. High and high top should be reserved for cases where the extra performance is really needed.

  3. The system property debug.oculus.foveation.level is a system-wide FFR setting override, with 0 = Off, 1 = Low, 2 = Medium, 3 = High, 4 = High Top (for example, adb shell setprop debug.oculus.foveation.level 2 will set the FFR level to medium). This can be used to quickly test different FFR settings without changing/reinstalling/restarting the app. If you’re deciding whether to switch to 1.34 for the new FFR settings, use the system property debug.oculus.foveation.usev2 to override the FFR configuration regardless of OVRPlugin version, with 0 = old settings and 1 = new settings.

Examples:

  • A simple, effective example would be to turn off FFR in menu screens where there is performance headroom to spare and a lot of text elements, and then turning it on after loading into to game where the performance is needed.
  • Another example would be to set FFR to medium or low on an outdoor scene, changing to high when entering a darker cave or tunnel level, and then switching back to medium when changing to an outdoor level again.