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 insbesondere für virtuelle Realität (VR) und WebXR nützlich.

Weitere Informationen finden Sie auch unter:

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 zum Rendern in einen multisample-fähigen Backbuffer zu verwenden, weshalb Sie Kontexte mit antialias: false erstellen sollten. Der Oculus-Browser (6+) unterstützt jedoch auch Multisampling mit der OCULUS_multiview-Erweiterung. Siehe auch dieses WebGL-Problem.

Konstanten

Diese Erweiterung stellt 4 Konstanten bereit, die in getParameter() oder getFramebufferAttachmentParameter() verwendet werden können.

FRAMEBUFFER_ATTACHMENT_TEXTURE_NUM_VIEWS_OVR

Anzahl der Ansichten der Framebuffer-Objekt-Anhängigkeit.

FRAMEBUFFER_ATTACHMENT_TEXTURE_BASE_VIEW_INDEX_OVR

Basis-Ansichtsindex der Framebuffer-Objekt-Anhängigkeit.

MAX_VIEWS_OVR

Die maximale Anzahl von Ansichten. Die meisten VR-Headsets haben zwei Ansichten, aber es gibt Prototypen von Headsets mit einem ultra-weiten Sichtfeld, die 4 Ansichten verwenden, was derzeit die maximale Anzahl von Ansichten ist, die von Multiview unterstützt werden.

FRAMEBUFFER_INCOMPLETE_VIEW_TARGETS_OVR

Wenn baseViewIndex nicht für alle Framebuffer-Anbringungspunkte gleich ist, bei denen der Wert von FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE nicht NONE ist, wird der Framebuffer als unvollständig betrachtet. Der Aufruf von checkFramebufferStatus für einen solchen Framebuffer gibt FRAMEBUFFER_INCOMPLETE_VIEW_TARGETS_OVR zurück.

Instanzmethoden

framebufferTextureMultiviewOVR()

Rendert gleichzeitig zu mehreren Elementen eines 2D-Texturarrays.

Beispiele

Dieses Beispiel stammt aus der Spezifikation.

js
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

cpp
#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 auch dieses three.js Demo für ein Live-Multiview-Beispiel.

Spezifikationen

Specification
WebGL OVR_multiview2 Extension Specification

Browser-Kompatibilität

BCD tables only load in the browser

Siehe auch