OVR_multiview2 Erweiterung
Limited availability
This feature is not Baseline because it does not work in some of the most widely-used browsers.
Die OVR_multiview2
Erweiterung ist Teil der WebGL API und fügt Unterstützung für das gleichzeitige Rendern in mehrere Ansichten hinzu. Dies ist besonders nützlich für Virtual Reality (VR) und WebXR.
Weitere Informationen finden Sie auch unter:
- Multiview on WebXR
- Multiview in babylon.js
- Optimizing Virtual Reality: Understanding Multiview
- Multiview WebGL Rendering for Meta Quest
WebGL-Erweiterungen sind über die Methode WebGLRenderingContext.getExtension()
verfügbar. Weitere Informationen finden Sie auch unter Verwendung von Erweiterungen im WebGL Leitfaden.
Hinweis: Die Unterstützung hängt vom Grafiktreiber des Systems ab (Windows+ANGLE und Android werden unterstützt; Windows+GL, Mac, Linux werden nicht unterstützt).
Diese Erweiterung ist nur für WebGL 2 Kontexte verfügbar, da sie GLSL 3.00 und Texturarrays benötigt.
Derzeit gibt es keine Möglichkeit, Multiview zu verwenden, um auf einen multisamplierten Backbuffer zu rendern, daher sollten Sie Kontexte mit antialias: false
erstellen. Der Oculus Browser (ab Version 6) unterstützt jedoch auch Multisampling mit der OCULUS_multiview
Erweiterung. Siehe auch dieses WebGL Problem.
Konstanten
Diese Erweiterung stellt 4 Konstanten zur Verfügung, die in getParameter()
oder getFramebufferAttachmentParameter()
verwendet werden können.
FRAMEBUFFER_ATTACHMENT_TEXTURE_NUM_VIEWS_OVR
-
Anzahl der Ansichten des Framebuffer-Objekt-Anhangs.
FRAMEBUFFER_ATTACHMENT_TEXTURE_BASE_VIEW_INDEX_OVR
-
Basis-Ansichtindex des Framebuffer-Objekt-Anhangs.
MAX_VIEWS_OVR
-
Maximale Anzahl der Ansichten. Die meisten VR-Headsets haben zwei Ansichten, aber es gibt Prototypen von Headsets mit ultraweitem Sichtfeld, die 4 Ansichten verwenden, was derzeit die maximale Anzahl der von Multiview unterstützten Ansichten ist.
FRAMEBUFFER_INCOMPLETE_VIEW_TARGETS_OVR
-
Wenn baseViewIndex nicht für alle Framebuffer-Anhangspunkte, bei denen der Wert von
FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE
nichtNONE
ist, gleich ist, wird der Framebuffer als unvollständig betrachtet. Ein Aufruf voncheckFramebufferStatus
für einen Framebuffer in diesem Zustand gibtFRAMEBUFFER_INCOMPLETE_VIEW_TARGETS_OVR
zurück.
Instanzmethoden
framebufferTextureMultiviewOVR()
-
Rendert gleichzeitig in mehrere Elemente eines 2D-Texturarrays.
Beispiele
Dieses Beispiel ist aus der Spezifikation entnommen.
const gl = document
.createElement("canvas")
.getContext("webgl2", { antialias: false });
const ext = gl.getExtension("OVR_multiview2");
const fb = gl.createFramebuffer();
gl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, fb);
const colorTex = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D_ARRAY, colorTex);
gl.texStorage3D(gl.TEXTURE_2D_ARRAY, 1, gl.RGBA8, 512, 512, 2);
ext.framebufferTextureMultiviewOVR(
gl.DRAW_FRAMEBUFFER,
gl.COLOR_ATTACHMENT0,
colorTex,
0,
0,
2,
);
const depthStencilTex = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D_ARRAY, depthStencilTex);
gl.texStorage3D(gl.TEXTURE_2D_ARRAY, 1, gl.DEPTH32F_STENCIL8, 512, 512, 2);
ext.framebufferTextureMultiviewOVR(
gl.DRAW_FRAMEBUFFER,
gl.DEPTH_STENCIL_ATTACHMENT,
depthStencilTex,
0,
0,
2,
);
gl.drawElements(/* … */); // draw will be broadcasted to the layers of colorTex and depthStencilTex.
Shader Code
#version 300 es
#extension GL_OVR_multiview2 : require
precision mediump float;
layout (num_views = 2) in;
in vec4 inPos;
uniform mat4 u_viewMatrices[2];
void main() {
gl_Position = u_viewMatrices[gl_ViewID_OVR] * inPos;
}
Sehen Sie sich auch dieses three.js Demo für ein Live-Multiview-Beispiel an.
Spezifikationen
Specification |
---|
WebGL OVR_multiview2 Extension Specification |