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, you can run additional OpenXR plugins or customize the complete code to suit your project needs.
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:
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.
In the Unreal Editor, navigate to Project Settings > Meta XR > General and set XR API to OpenXR.
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.
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.