Foveated Rendering
Foveated rendering is a rendering technique that provides a performance boost by reducing the workload of the GPU in exchange for a loss of some visual fidelity starting at the outer edge of the screen.
To make use of this technique, the Foveated Rendering feature must be enabled in Project Settings > XR Plug-in Management > OpenXR (> Android Tab) > OpenXR Feature Groups > Snapdragon Spaces > Foveated Rendering.
The Snapdragon Spaces SDK makes use of Fixed Foveated Rendering (FFR) to adjust the image as it is presented to the user on the XR headset. This technique reduces the resolution of the image starting at the edges of vision. As a result, the GPU does less work when rendering each frame. This can improve the framerate resulting in a smoother user experience, and reduce power consumption and device heat.
Feature Settings
When enabled, the foveation level can be controlled at application startup through the feature setting Default Foveation Level
and on demand at runtime by calling the static class method SpacesFoveatedRendering.SetFoveationLevel
.
The foveation level can be set to None
, Low
, Medium
or High
.
Level | Visuals | Performance |
---|---|---|
None | Normal rendered image. | No impact on performance. |
Low | Visual fidelity reduced at outermost edge of vision. | Slight boost to performance. |
Medium | Visual fidelity reduced at edge of vision. | Moderate boost to performance. |
High | Visual fidelity reduced, except in center of vision. | Highest boost to performance. |
- The boost to performance at each level is hardware dependent.
- The degree to which visual fidelity is reduced at each level is hardware dependent.
- It is recommended that developers benchmark the visual changes from enabling foveation themselves. Frame time is a useful metric for assessing the performance impact.
Setting the Default Foveation Level
applies foveation immediately on application start.
This affects rendering in XR immediately and will be visible for splash-screens, images, or text displayed on the headset, as soon as the application starts. This is set to None
by default.
Calling SetFoveationLevel
at runtime will change the foveation level on request.
The chosen level will persist until the method is called again.
SpacesFoveatedRendering.SetFoveationLevel(FoveationLevel.Medium);
If this method is called on Start
for a component attached to a GameObject in the scene, this will be applied immediately when the scene begins, and after any splash-screens are displayed if this is the first scene the application opens.
The current foveation level can be queried programmatically by calling the static class method SpacesFoveatedRendering.TryGetFoveationLevel
.
FoveationLevel foveationLevel;
if (TryGetFoveationLevel(out foveationLevel))
{
...
}
The method will return false
if the Foveated Rendering
feature is invalid or not enabled. In this case, the out parameter foveationLevel
will also be set to None
.
Foveated rendering is not compatible with the Universal Render Pipeline's (URP) Camera Stacking feature.
If an application requires both features, consider alternatives to Camera Stacking such as a shared RenderTexture
or successive rendering with CameraClearFlags.Nothing
. In this case, foveated rendering will only be applied to the first camera rendered: the camera with the lowest Camera.depth
. Despite this limitation, performance will still improve based on the content rendered by the camera.