Choosing an OpenXR Backend
Updated: Apr 7, 2025
There are two OpenXR pathways (XrApi) to choose from when developing your app with the
MetaXR Plugin:
Epic Native OpenXR Plugin and
Oculus OVRPlugin.
- 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, developers can run additional OpenXR plugins or customize the complete code to suit your project needs.
- Oculus OVRPlugin - The OVRPlugin is our legacy backend. Existing UE projects can continue to utilize it to maintain the highest level of HzOS platform compatibility.
Note: Currently the Epic Native OpenXR backend is only available when using the
Oculus VR Fork Unreal Version. We are in the process of migrating all features from OVRPlugin to the Epic Native OpenXR Plugin. We expect Epic Native OpenXR to be the recommended path once this migration is completed.
The table below outlines the key differences, today, between Epic Native OpenXR Plugin and OVRPlugin. All features work across both solutions unless specified below (we are actively working to add the planned features below to enable parity):
Feature | Epic with Oculus Extensions | OVRPlugin |
Works with other OpenXR Plugins | ✓ | - |
Fully Customizable Source Code | ✓ | - |
| | ✓ |
| - | ✓ |
| | ✓ |
| Planned | ✓ |
Migrating to the OpenXR Backend
Change Project Settings > Meta XR > General > XR API to OpenXR
Restart the Editor
- 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
- 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.
- The Aim pose is used for pointing or aiming. These components should now use a separate motion controller that uses the Aim motion source. (See Epic’s VRTemplate Sample)
- SplashScreen
- There is no longer a default splash screen. Applications should call the blue print method Add Loading Screen Splash to add a splash screen.
- 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