# Optimize for untethered XR devices in URP workflow

> Optimize graphics performance for untethered extended reality (XR) devices in Universal Render Pipeline (URP) projects.

Follow this workflow to optimize graphics performance for untethered extended reality (XR) devices in Universal Render Pipeline (URP) projects.

An untethered XR device is an XR device that isn't connected to a desktop with a wire. Most untethered XR devices use tile-based GPUs. The tasks in this workflow help you use this hardware architecture more efficiently and avoid rendering techniques that are less efficient on those devices. To learn more about how tile-based GPUs work, refer to [Additional resources](#additional-resources).

To optimize your URP project for untethered XR devices, complete the following tasks:

* [Use the Vulkan API](#vulkan)
* [Use the OpenXR Plugin](#openxr)
* [Use the render graph system](#render-graph)
* [Choose a rendering path](#rendering-path)
* [Use on-tile post-processing](#post-processing)
* [Avoid geometry shaders](#geometry-shaders)
* [Use MSAA for anti-aliasing](#msaa)
* [Disable depth priming](#depth-priming)
* [Disable Opaque texture and Depth texture properties](#textures)
* [Use a depth input attachment](#depth-input-attachment)
* [Disable SSAO](#ssao)
* [Disable HDR](#hdr)
* [Implement resolution scaling](#resolution-scaling)
* [Optimize shaders for the Meta Quest build profile](#meta-quest-build-profile-optimization)
* [Use Adaptive Performance for OpenXR projects](#adaptive-performance)
* [Enable Quad views](#quad-views)

The following sections describe these methods in more detail.

## Use the Vulkan API

Vulkan API is more stable and provides better performance compared to OpenGL ES API in URP projects targeting XR platforms. Many new OpenXR features are only available on Vulkan.

Refer to [Configure graphics APIs](/engine/6000.7/manual/platform-specific/cross-platform-features/graphics-apis/configure.md#override-default-gfxapi) for information on how to change the graphics API to Vulkan.

## Use the OpenXR Plugin

Use the [OpenXR Plugin](https://docs.unity3d.com/Packages/com.unity.xr.openxr@1.18/) in projects that target XR platforms.

Enable the following settings in your OpenXR project:

* [Multi-view \ Single pass rendering](https://docs.unity3d.com/Packages/com.unity.xr.openxr@1.18/manual/project-configuration.html#set-the-render-mode)
* [Foveated rendering](https://docs.unity3d.com/Packages/com.unity.xr.openxr@1.18/manual/features/foveatedrendering.html)
* [Multiview render regions](https://docs.unity3d.com/Packages/com.unity.xr.openxr@1.18/manual/features/multiviewrenderregions.html)

> **Tip:**
>
> Consider whether [URP Application SpaceWarp](https://docs.unity3d.com/Packages/com.unity.xr.openxr@1.18/manual/features/spacewarp.html) is appropriate for your project. Application SpaceWarp can improve frame rate significantly, but might cause visible artifacts for some content.

## Use the render graph system

In Unity 6.0 and newer, new URP projects use the render graph system. Refer to [Benefits of the render graph system](https://docs.unity3d.com/Packages/com.unity.render-pipelines.core@17.0/manual/render-graph-benefits.html) to understand the benefits of render graph.

## Choose a rendering path

On Unity versions earlier than 6.7, Forward or Forward+ rendering is the more efficient render path on tile-based GPUs. In Unity 6.7 and later, Deferred rendering adds on-tile support, which reduces its memory bandwidth overhead and makes it a viable choice for scenes with many dynamic lights. Multi-sample antialiasing (MSAA) is supported only with Forward and Forward+ rendering.

You can change the Rendering Path in the [**Rendering**](/engine/6000.7/manual/render-pipelines/universal-render-pipeline/urp-reference/urp-universal-renderer.md#rendering) section of the [Universal Renderer Asset](/engine/6000.7/manual/render-pipelines/universal-render-pipeline/urp-reference/urp-universal-renderer.md). For more information on choosing between rendering paths, refer to [Deferred and Deferred+ rendering paths in URP](/engine/6000.7/manual/render-pipelines/universal-render-pipeline/introduction/urp-concepts/rendering-paths/deferred-rendering-path.md).

## Use on-tile post-processing

On XR devices, Unity recommends that you use on-tile post-processing, because post-processing is expensive on untethered XR devices without on-tile mode enabled. In versions of Unity earlier than 6.3, on-tile post-processing isn't available, so Unity recommends that you disable post-processing techniques instead.

Refer to [On-tile post-processing](/engine/6000.7/manual/post-processing-and-full-screen-effects/urp/on-tile-post-processing.md) to learn more about on-tile post-processing and how to enable it in your XR project.

## Avoid geometry shaders

Avoid using geometry shaders on platforms with tile-based GPUs. Generating additional primitives and vertices breaks the tiled GPU flow, and some devices don't support geometry shaders at all.

For more information on tile-based GPUs, refer to [Tile-based rendering in XR](/engine/6000.7/manual/xr/graphics/on-tile-rendering.md).

## Use MSAA for anti-aliasing

MSAA is efficient on tile-based GPUs. A 2X MSAA value provides a good balance between visual quality and performance in most projects.

The balance changes on Meta Quest if your project uses post-processing. In Unity 6.7 and later with the OpenXR Plug-in 1.19.0 or later, Unity skips foveation on URP's post-processing and final blit passes. This reduces GPU frame time, but only in projects that don't use MSAA. To find the better trade-off for your project, profile it with MSAA enabled and disabled. For more information about foveation on the final passes, refer to [Foveated rendering in OpenXR](https://docs.unity3d.com/Packages/com.unity.xr.openxr@latest?subfolder=/manual/features/foveatedrendering.html) (OpenXR package documentation).

You can change the MSAA settings in the **Quality** section of the URP asset. For more information on MSAA, refer to [Anti-aliasing in URP](/engine/6000.7/manual/render-pipelines/universal-render-pipeline/anti-aliasing.md).

> **Note:**
>
> MSAA is only supported with [Forward and Forward+ rendering](#rendering-path).

> **Note:**
>
> MSAA breaks on-tile rendering. If you enable Tile-Only Mode or on-tile post-processing, disable MSAA.

## Disable depth priming

Disable depth priming on XR platforms. XR devices have two views, which increases the performance impact from performing the depth pre-pass.

For untethered XR devices there are no benefits of performing the depth priming. You can obtain similar results using hardware optimization features, such as Low-Resolution-Z (LRZ) or Hidden Surface Removal (HSR).

For information on how to configure or disable depth priming, refer to the [Depth Priming Mode](/engine/6000.7/manual/render-pipelines/universal-render-pipeline/urp-reference/urp-universal-renderer.md#rendering) property description.

## Disable Opaque texture and Depth texture properties

Disable the **Opaque Texture** and **Depth Texture** properties to improve performance. Enabling those options causes extra texture copy operations, which requires extra GMEM loads.

For more information about opaque and depth texture properties, refer to [Rendering](/engine/6000.7/manual/render-pipelines/universal-render-pipeline/urp-reference/universalrp-asset.md#rendering).

To identify if your current configuration is using intermediate textures, use the [Render Graph Viewer](/engine/6000.7/manual/render-pipelines/universal-render-pipeline/customizing-urp/render-graph/view.md) window.

## Use a depth input attachment

If an effect needs the current pixel depth, use a depth input attachment instead of enabling the **Depth Texture** property, to avoid the performance cost of copying the depth buffer to and from video memory.

To enable reading depth with a depth input attachment, refer to [Get the current depth buffer from GPU memory in URP](/engine/6000.7/manual/analysis/graphics-performance-profiling/in-urp/framebuffer-fetch/read-depth-input-attachment.md).

> **Note:**
>
> Depth input attachments are supported only on DirectX 12 and Vulkan.

## Disable SSAO

Screen Space Ambient Occlusion (SSAO) might have poor performance on mobile and untethered XR devices, because it requires several passes that have a high performance impact on tile-based GPUs.

Refer to [SSAO](/engine/6000.7/manual/lighting-overview/lighting/shadows-in-urp/post-processing-ssao/ssao.md) for more information.

## Disable HDR

High Definition Rendering (HDR) has higher precision and improves graphics fidelity, but requires more bits per pixel to process. Disable HDR to reduce memory bandwidth and improve performance.

Most untethered XR devices don't support HDR rendering.

To disable HDR:

1. Select a URP asset.
2. In the Editor window, in the **Quality** section, disable Editor.

> **Note:**
>
> some features, such as HDR light estimation require HDR. Check the requirements for the features your project uses to ensure HDR isn't required.

## Implement resolution scaling

Unity recommends that you implement resolution scaling to reduce GPU workload and maintain a stable frame rate.

To learn more, refer to [Resolution control in XR projects](/engine/6000.7/manual/xr/graphics/resolution-scaling.md).

## Optimize shaders for the Meta Quest build profile

When you [Configure the Meta Quest build profile](/engine/6000.7/manual/xr/configuring-project-for/meta-quest-develop/build-profile.md), Unity enables some automatic shader optimizations to reduce GPU frame time. You can also configure additional shader optimizations in your project. To learn more, refer to [Configure shader optimizations for Meta Quest](/engine/6000.7/manual/xr/configuring-project-for/meta-quest-develop/graphics-optimization.md).

## Use Adaptive Performance for OpenXR projects

In Unity 6.6 and newer, the [Adaptive Performance](/engine/6000.7/manual/analysis/runtime-performance-scaling/adaptive-performance.md) module supports OpenXR devices.

Enable the Adaptive Performance [Basic provider](/engine/6000.7/manual/analysis/runtime-performance-scaling/adaptive-performance/get-started/providers/basic-provider.md) in your OpenXR project to automatically adjust application quality based on device frame timing. Adaptive Performance helps maintain smoother performance and a more consistent user experience on XR devices.

## Enable quad views

In Unity 6.5 and later with OpenXR 1.17 and later, you can enable quad views for projects that target Meta Quest devices.

Quad views renders peripheral areas at lower resolution and the central focus area at full resolution. Quad views reduces render time while maintaining perceived visual quality.

For more information, refer to [Quad views](https://docs.unity3d.com/Packages/com.unity.xr.openxr@1.18/manual/features/quadviews.html) (OpenXR package documentation).

## Additional resources

* [Graphics performance and profiling in URP](/engine/6000.7/manual/analysis/graphics-performance-profiling/in-urp.md)
* [XR graphics](/engine/6000.7/manual/xr/graphics.md)
* [Reduce GPU bandwidth with on-tile rendering](/engine/6000.7/manual/analysis/graphics-performance-profiling/in-urp/on-tile-rendering.md)
* [Introduction to runtime performance scaling](/engine/6000.7/manual/analysis/runtime-performance-scaling/introduction.md)
* [Tile-Based Rendering](https://developer.arm.com/documentation/102662/0100/Overview) (Arm)
