Eye Tracked Foveated Rendering
Updated: Dec 16, 2024
Eye Tracked Foveated Rendering (ETFR) utilizes the gaze direction to render full resolution where you are looking at (the foveal region), and low pixel density in the periphery, taking advantage of lower peripheral acuity in human vision. The technique reduces the amount of pixels rendered more than when using Fixed Foveated Rendering which leads to better GPU savings.
Eye Tracked Foveated Rendering is the next evolution of FFR (Fixed Foveated Rendering), which renders at full resolution in the center of the screen (in the foveal region), and low resolution in the periphery. This provides substantial GPU savings for Meta Quest applications.
In the case of ETFR, the foveal region is moved around to match where you’re looking using eye tracking. Because the low resolution region is hidden in your peripheral vision at all times, more aggressive foveation maps can be used resulting in more GPU saving.
Before you begin with ETFR, make sure to use the latest version of the Meta Quest Pro operating system and Oculus Integration SDK. Here are the requirements to enable ETFR for your application:
- Meta Quest Pro headset
- Unreal Engine 4.27 (v46 Integration SDK) or higher
- Build and run Unreal Engine editor by following Creating Your First Meta Quest VR App in Unreal Engine.
- Click Settings > Project Settings.
- Under Platform > Android > Build, make sure that Support Vulkan is selected and Support OpenGL ES3.1 is unselected, as ETFR is a Vulkan only feature.
- Under Plugins > Oculus VR > General > XR API, make sure OpenXR OVRPlugin is selected, as ETFR is only available in OpenXR OVRPlugin.
- Under Plugins > Meta XR > Mobile > Foveated Rendering, make sure Support Eye Tracked Foveated Rendering is selected. This enables ETFR support in the current Unreal project so it can be controlled via global settings, Blueprints or C++ interfaces.
Under Plugins > Foveated Rendering, do the following:
- Set Foveated Rendering Method to Eye Tracked Foveated Rendering.
- Set Foveated Rendering Level to whatever ETFR level you want your content to render at. The foveation map visualization can be found in the Using The Extra GPU Savings section.
- Optionally check Dynamic Foveated Rendering to adjust ETFR level based on the GPU load (but make sure to test the graphics quality and perf with this option unchecked during development)
- When ETFR is enabled, if eye tracking is or becomes unavailable (e.g. if user declines the permission or turn off eye tracking in the system settings), the app will automatically fall back to Dynamic High FFR to maintain as much performance as possible relative to ETFR, unless overridden with specific settings.
Enable ETFR via Blueprints
The Oculus Function Library has additional nodes for ETFR functionality. Refer to the Blueprint sample for a simple example of how they can be used.
The Get Eye Tracked Foveated Rendering Supported function allows you to check if the device your app is running on supports ETFR. This can be used to change settings or behaviors if your app is running on a device that doesn’t support ETFR.
The Set Foveated Rendering Method function allows you to switch between FFR and ETFR at runtime. If eye tracking permission has not yet been granted, the user will be prompted about eye tracking permission at this time; If permission is denied, the app will automatically fall back to Dynamic High FFR.
The Oculus XR Event Component has a new delegate Oculus Eye Tracking State Changed that can be used to execute functions when eye tracking becomes available or unavailable at runtime. This can be due to situations such as eye tracking permissions being denied, or a problem with the eye tracking.
By default, when using ETFR, if eye tracking becomes unavailable, it will fall back to dynamic High FFR, but you can use this delegate to override the default FFR fallback, as well as potentially change graphical settings or resolution to account for performance differences.
Build And Test Your Application
- Click File > Package Project > Android > Android (ASTC) to build and package into an APK file.
The following section offers several best practices to integrate ETFR in your application.
There are a few things to keep in mind when integrating ETFR in your application. The first one is that the feature is only available on Meta Quest Pro. If your application is shipping for Meta Quest 2, you’ll need to make sure to enable the feature only if the device supports it.
It’s also possible that users disable Eye Tracking from the system settings or don’t accept the permission request for Eye Tracking. In those cases, ETFR will not be turned on when calling SetFoveatedRenderingMethod(EyeTrackedFoveatedRendering)
Finally, it’s a good idea to have an option in your application’s settings so that users can turn it on and off depending on their preference.
Because of that, it is important to understand that whatever you decide to do with the extra performance you get from ETFR might need to be turned off depending on some of those factors.
ETFR on average has higher GPU savings compared to FFR across all levels by using a more aggressive foveation map as shown below. Devs can choose between performance savings and visual quality by selecting a foveation level that best fits their application’s content, along with other surface parameters like MSAA and eye texture scale factor.
One of the recommended ways to use the extra GPU performance from ETFR is to increase eye textures size for crisper and shaper images. Here’s an example of the GPU render time for FFR / ETFR rendered at both default and increased eye texture size for one of our test application:
As an example, if this application were using FFR-3, we could switch to ETFR-2 and use an increased eye texture resolution with MSAA2 for a sharper image at around the same GPU time cost.
The GPU saving you’ll get from ETFR will depend on your application’s content, so make sure to profile your application at different foveation levels and render target size, in order to determine which combination works the best for you.
We also recommend turning on dynamic foveated rendering so that the foveation level is adjusted automatically based on the current GPU rendering load. The maximum foveation level that can be used is specified by foveated rendering level. You should make sure to fully test the rendering quality (e.g. not too much foveation artifact in the peripheral vision) at the maximum foveation level before enabling this option.