diff --git a/examples/files.json b/examples/files.json
index 966fdbf942759b..c669eb6d0a9fa0 100644
--- a/examples/files.json
+++ b/examples/files.json
@@ -464,6 +464,7 @@
"webgpu_water",
"webgpu_xr_rollercoaster",
"webgpu_xr_cubes",
+ "webgpu_xr_media_layer",
"webgpu_xr_native_layers"
],
"webaudio": [
diff --git a/examples/screenshots/webgpu_xr_media_layer.jpg b/examples/screenshots/webgpu_xr_media_layer.jpg
new file mode 100644
index 00000000000000..7e5e745ac5f4d7
Binary files /dev/null and b/examples/screenshots/webgpu_xr_media_layer.jpg differ
diff --git a/examples/webgpu_xr_media_layer.html b/examples/webgpu_xr_media_layer.html
new file mode 100644
index 00000000000000..52f417e0cf6681
--- /dev/null
+++ b/examples/webgpu_xr_media_layer.html
@@ -0,0 +1,246 @@
+
+
+
+ three.js vr - 360 stereo video
+
+
+
+
+
+
+
+
+
three.js vr - 360 stereo/mono video native media layers
+ stereoscopic panoramic render by
pedrofe. scene from
mery project.
+ Choose Layout:
+
+
+
+
+
+
+
+
+
diff --git a/src/renderers/common/XRManager.js b/src/renderers/common/XRManager.js
index 67feb75ed4c62e..ab45ed704e989b 100644
--- a/src/renderers/common/XRManager.js
+++ b/src/renderers/common/XRManager.js
@@ -14,12 +14,25 @@ import { CylinderGeometry } from '../../geometries/CylinderGeometry.js';
import QuadMesh from './QuadMesh.js';
import NodeMaterial from '../../materials/nodes/NodeMaterial.js';
import { PlaneGeometry } from '../../geometries/PlaneGeometry.js';
+import { SphereGeometry } from '../../geometries/SphereGeometry.js';
import { MeshBasicMaterial } from '../../materials/MeshBasicMaterial.js';
import { Mesh } from '../../objects/Mesh.js';
+import { Group } from '../../objects/Group.js';
const _cameraLPos = /*@__PURE__*/ new Vector3();
const _cameraRPos = /*@__PURE__*/ new Vector3();
+const UVMapFactors = {
+ 'stereo-top-bottom': [
+ { yMult: 0.5, yPhase: 0, xMult: 1.0, xPhase: 0 },
+ { yMult: 0.5, yPhase: 0.5, xMult: 1.0, xPhase: 0 }
+ ],
+ 'stereo-left-right': [
+ { yMult: 1.0, yPhase: 0, xMult: 0.5, xPhase: 0 },
+ { yMult: 1.0, yPhase: 0, xMult: 0.5, xPhase: 0.5 }
+ ]
+};
+
/**
* The XR manager is built on top of the WebXR Device API to
* manage XR sessions with `WebGPURenderer`.
@@ -379,6 +392,22 @@ class XRManager extends EventDispatcher {
*/
this._useMultiview = false;
+ /**
+ * Stores params and video elements for equirect layers.
+ *
+ * @private
+ * @type {Array