Skip to main content

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.

The Foveated Rendering feature must be enabled in Project Settings > XR Plug-in Management > OpenXR (> Android Tab) to make use of this technique.

Composition Layer Component

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.

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.

LevelVisualsPerformance
NoneNormal rendered image.No impact on performance.
LowVisual fidelity reduced at outermost edge of vision.Slight boost to performance.
MediumVisual fidelity reduced at edge of vision.Moderate boost to performance.
HighVisual fidelity reduced, except in center of vision.Highest boost to performance.
NOTE
  • 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);
USAGE TIP

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.