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, the Oculus Fixed Foveation system is not based on eye tracking. The high-resolution pixels are fixed in the center of the eye texture.
Implementing Fixed Foveated Rendering
To set dynamic foveation, do the following:
OVRManager.fixedFoveatedRenderingLevel = FixedFoveatedRenderingLevel.High; // it's the maximum foveation level OVRManager.useDynamicFixedFoveatedRendering = true;
Oculus supports the following rendering levels to set the relevant degree of foveation:
Lowis the low FFR setting
Mediumis the mid FFR setting
Highis the high FFR setting
HighTopis the high top FFR setting
The following images demonstrate the degree to which the resolution is affected.
In the images above, the white areas at the center of FOV, the resolution is native: every pixel of the texture is computed independently by the GPU. However, in the red areas, only 1/2 of the pixels are calculated, 1/4 for the green areas, 1/8 for the blue areas, and 1/16 for the magenta tiles. The missing pixels are interpolated from the calculated pixels at resolve time, when the GPU stores the result of its computation in general memory.
You can change the degree of foveation based on the scene elements. Apps or scenes with high pixel shader costs benefit the most from using FFR. Apps with very simple shaders may see a net performance loss from the overhead of using FFR. Proper implementation of FFR requires testing and tuning to balance visual quality and GPU performance.
Generally, apps should not use FFR as solution for performance, this may have have a very noticeable impact on visuals.
We have summarized few best practices on tuning the FFR settings based on internal feedback and testing:
. *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.
. *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.
. *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 (available on Oculus Quest). For example, adb shell setprop
debug.oculus.foveation.level 2 sets the FFR level to medium. This can be used to quickly test different FFR settings without changing, reinstalling, or 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.