Develop

Choosing an OpenXR Backend

Updated: Apr 17, 2026

Overview

There are two OpenXR pathways (XrApi) to choose from when developing your app with the MetaXR Plugin: Epic Native OpenXR Plugin and Oculus OVRPlugin.
  1. Epic Native OpenXR Plugin: With the OpenXR backend, the Meta XR plugin runs in an extension mode and extends the capabilities of the Epic Native OpenXR Plugin that is shipped with Unreal. In this mode, you can run additional OpenXR plugins or customize the complete code to suit your project needs.
  2. Oculus OVRPlugin: The OVRPlugin is the legacy backend. Existing UE projects can continue to utilize it to maintain the highest level of HzOS platform compatibility.
Note: The Epic Native OpenXR Plugin is the recommended backend for new projects. Some features, such as Late Latching, are only available when using the Oculus-VR fork. The OVRPlugin backend remains available for existing projects.
The table below outlines the current key differences between Epic Native OpenXR Plugin and OVRPlugin. All features work across both solutions unless specified below:
FeatureEpic Native OpenXR PluginOVRPlugin
Works with other OpenXR Plugins
-
Fully Customizable Source Code
-
-
Note: Application Space Warp on the Epic Native OpenXR backend requires the Oculus-VR fork in stable Unreal Engine releases. Starting with UE 5.7, Epic’s native xr.OpenXRFrameSynthesis CVar provides equivalent functionality without requiring the fork.

Migrating to the OpenXR Backend

If you want to switch an existing project to the Epic Native OpenXR Plugin, follow the steps below.
  1. In the Unreal Editor, navigate to Project Settings > Meta XR > General and set XR API to OpenXR.
    Project Settings Meta XR General panel with XR API set to OpenXR.
  2. Restart the Editor.

Required Project Changes

Hand Tracking

  • Epic’s OpenXR Hand Tracking plugin must be enabled for hand tracking
    • Installing the plugin does not cause any compatibility issues with the legacy OVRPlugin path
  • Motion source for hand tracking using default models should be set to wrist
    • To switch between hands and controllers, create a separate motion controller component for each, and toggle visibility based on hand tracking enabled status

Input

  • The Oculus controller pose is deprecated. Use the OpenXR Grip or Aim motion source instead.
    • The Grip pose is used for objects rendered at the user’s hand. Since the orientation is different, use the OculusXRLegacyPoseTransformComponent to transform Oculus pose models into grip pose by inserting it in between the UMotionControllerComponent and its children.
    OculusXRLegacyPoseTransformComponent inserted between MotionController and child components.
    • The Aim pose is used for pointing or aiming. These components should now use a separate motion controller that uses the Aim motion source. For a reference implementation, see Epic’s VR Template sample.

SplashScreen

  • There is no longer a default splash screen. Applications should call the Blueprint method Add Loading Screen Splash to add a splash screen.

StereoLayers

  • The OVRPlugin backend can simulate depth on cubemap layers by displaying objects from the scene in front of the cubemap when Supports Depth is enabled. This option is currently not supported on cubemap layers when using the OpenXR backend; instead, the cubemap will always be displayed over any objects in the scene.

Known Issues with Epic OpenXR

  • StereoLayers with Mipmaps may be translucent. Disable mipmaps on textures used with quad StereoLayers.