openxr_passthrough.rst 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. .. _doc_openxr_passthrough:
  2. The OpenXR passthrough
  3. ======================
  4. Passthrough is a technique where camera images are used to present the environment of the user as the background.
  5. This turns a VR headset into an AR headset, often referred to as Mixed Reality or MR.
  6. .. note::
  7. As passthrough is relatively new there isn't a singular way this is implemented across platforms.
  8. There may be additions in the future so this is a work in progress.
  9. Passthrough extension
  10. ---------------------
  11. OpenXR has a vendor extension for passthrough submitted by Meta.
  12. Currently this extension is only supported on Quest but may be adopted by other headsets in the future.
  13. :ref:`XRInterface <class_xrinterface>` has entry points for passthrough so different interfaces can implement this feature.
  14. For :ref:`OpenXRInterface <class_openxrinterface>` the meta passthrough extension is implemented here.
  15. In code you can call ``is_passthrough_supported`` to check if this extension is available.
  16. If so you can simply enable passthrough by calling ``start_passthrough``.
  17. You can call ``stop_passthrough`` to disable passthrough.
  18. This will automatically set the main viewports ``transparent_bg`` property to true.
  19. It will also result in the camera image being displayed as the background.
  20. This will result in the background settings in the environment being ignored and alpha being applied.
  21. .. note::
  22. For privacy reasons **no access** is given to the camera image.
  23. .. warning::
  24. After passthrough is enabled it is possible to change settings that will break passthrough.
  25. Be sure not to change the ``transparent_bg`` setting or the environment blend mode.
  26. This will result in the camera image no longer being visible but you still incur the overhead.
  27. Always use ``stop_passthrough`` if you wish to turn off passthrough.
  28. Finally, for using passthrough on the Quest you must set the following export property:
  29. .. image:: img/xr_export_passthrough.webp
  30. Passthrough through AR
  31. ----------------------
  32. Some of the headsets recently adding OpenXR support have taken a different approach.
  33. They simply mimic being an AR device. The Lynx R1 is such a device but others may be doing the same.
  34. The following thus applies to both passthrough devices that mimic AR, and actual AR devices.
  35. If ``is_passthrough_supported`` returns false the next step is to call ``get_supported_environment_blend_modes``.
  36. This will return a list of supported blend modes for submitting the main render image to OpenXR.
  37. We need to check if ``XR_ENV_BLEND_MODE_ALPHA_BLEND`` is present in this list.
  38. If so we can tell OpenXR to expect an image that can be alpha blended with a background.
  39. To do this, we simply call ``set_environment_blend_mode(xr_interface.XR_ENV_BLEND_MODE_ALPHA_BLEND)``.
  40. We must also set ``transparent_bg`` to true to ensure we submit the right image.
  41. Putting it together
  42. -------------------
  43. Putting the above together we can use the following code as a base:
  44. .. code-block:: gdscript
  45. func enable_passthrough() -> bool:
  46. var xr_interface: XRInterface = XRServer.primary_interface
  47. if xr_interface and xr_interface.is_passthrough_supported():
  48. return xr_interface.start_passthrough()
  49. else:
  50. var modes = xr_interface.get_supported_environment_blend_modes()
  51. if xr_interface.XR_ENV_BLEND_MODE_ALPHA_BLEND in modes:
  52. xr_interface.set_environment_blend_mode(xr_interface.XR_ENV_BLEND_MODE_ALPHA_BLEND)
  53. return true
  54. else:
  55. return false