In development for standalone VR such as Meta Quest, Fixed Foveated Rendering (FFR) is an extremely important function in order to reduce the rendering load (GPU load) and maintain performance (frame rate). However, if FFR is simply enabled (fixed at a high level), the resolution at the edges of the screen (the outer periphery of the field of view) will become extremely coarse, and a bug (or an unpleasant visual phenomenon) will occur in which a glaring mosaic-like jaggy (resolution collapse) becomes noticeable when the player moves their line of sight even slightly.

In this article, we will explain the dynamic control method using "Dynamic FFR" and specific implementation steps to improve the performance of Quest while suppressing the sudden collapse of the peripheral resolution due to FFR.

For beginners: How would you describe this problem in real life?

Let's compare the FFR mechanism and this problem to our "eye mechanism" and "frosted glass."

When humans look at something, we can clearly see what is in the center of our field of vision, but we only vaguely perceive what is at the edges (outer periphery) of our field of vision. VR's FFR is similar to this: the center of the lens that the player is looking at is drawn in ultra-high resolution, and the edges of the lens that the player is not looking at are intentionally lowered in image quality to save on the drawing load.

However, if you always set this image quality reduction setting to ``maximum'', the edges of your field of vision will go from being ``slightly blurry'' to ``frosted glass or a large dot mosaic pasted''. If you move your eyes even slightly, you'll see a glaring dot in the corner of your vision, causing VR sickness and a loss of immersion. To solve this problem, we will introduce an automatic regulator (Dynamic FFR) that darkens the frosted glass only when the GPU is busy (high load), and returns it to a clear and clear state when processing is light.

Problem symptoms and specific phenomena

If the outer resolution collapses due to FFR, the following symptoms will occur.

  • The outer periphery of the lens (especially the four corners of the screen) is displayed in a rough pixel pattern similar to old retro games, and the smooth gradation becomes a stair-like mosaic.
  • When you move your head, the coarse pixels in your peripheral vision flicker, making your eyes very tired.
  • There is no problem when playing in the editor, but it only occurs the moment you build on the actual Meta Quest machine and run the APK, so it is easy to overlook it until late in development.

Possible cause: Why is the resolution so degraded?

FFR divides the screen into several areas (center, middle, and outer periphery) and lowers the sampling frequency of the pixel shader in the outer periphery to increase GPU processing power. If you set the FFR level to a fixed value such as High or High Top in the Quest settings, the outer resolution will always be forced down to the lowest level regardless of the scene load status.

Especially in games where UI elements are placed at the edge of the screen, or text information is located near the outer periphery, the fixed FFR settings will completely collapse the text and make it unreadable. Additionally, depending on the post-effects and lighting conditions, a phenomenon (artifact) where the border line with reduced resolution shines white can easily occur.

Specific solutions and approaches

To resolve this issue, use a C# script to enable Dynamic FFR, which dynamically changes the FFR strength depending on the processing load (GPU load) of the current frame. This maintains beautiful image quality during normal times when there is plenty of processing time, and automatically raises the FFR level to prevent stuttering when the load increases and the frame rate is about to drop.

1. Dynamic FFR control implementation using C#

Use the OVRManager class provided by the Meta XR SDK (Oculus Integration) and apply the following dynamic control code when initializing the scene.

using UnityEngine;

public class VRPerformanceController : MonoBehaviour
{
    void Start()
    {
        // Enable dynamic FFR control (Dynamic FFR)
        OVRManager.fixedFoveatedRenderingDynamic = true;

        // Set the maximum allowed FFR level to "Medium" to prevent the outer periphery from collapsing too much
        OVRManager.foveatedRenderingLevel = OVRManager.FoveatedRenderingLevel.Medium;
        
        Debug.Log($"Dynamic FFR Enabled. Level limit set to: {OVRManager.foveatedRenderingLevel}");
    }
    
    void Update()
    {
        // For debugging during development: monitor current actual FFR level in logs
        #if UNITY_EDITOR || DEVELOPMENT_BUILD
        if (Input.GetKeyDown(KeyCode.F))
        {
            var currentLevel = OVRManager.foveatedRenderingLevel;
            Debug.Log($"Current FFR Active Level: {currentLevel}");
        }
        #endif
    }
}

2. Adjusting URP pipeline settings

By appropriately applying anti-aliasing (MSAA) not only in the Oculus settings but also in the URP settings, the boundaries of the FFR application area can be interpolated smoothly. We recommend setting Anti-aliasing (MSAA) to 4x or higher in the URP Asset settings.

Confirmation checklist useful in practice

This is a list to check whether the FFR settings are optimal before building a VR project.

Is
Check items Ideal settings and countermeasures
FFR operation modefixedFoveatedRenderingDynamic set to true (dynamic allocation guarantee in C#)?
Maximum level limit If the image quality is severely degraded, limit foveatedRenderingLevel to Medium or Low instead of High.
UI safe area Are important UI (stamina gauge and minimap) placed slightly closer to the center of the screen, avoiding the edge of the screen?

Summary

FFR is essential to maintain Meta Quest's drawing performance, but excessive settings will seriously impair the user's visual experience. By enabling Dynamic FFR using OVRManager and performing dynamic scaling according to the situation, you can smartly achieve both high image quality and smooth frame rate.