OVR_multiview2

OVR_multiview2 extension is part of the WebGL API and adds support for rendering into multiple views simultaneously. This especially useful for virtual reality (VR) and WebXR.

For more information, see also:

WebGL extensions are available using the WebGLRenderingContext.getExtension() method. For more information, see also Using Extensions WebGL tutorial .

Availability: Support depends on the system's graphics driver (Windows+ANGLE and Android are supported; Windows+GL, Mac, Linux are not supported).

This extension is only available to WebGL 2 contexts as it needs GLSL 3.00 and texture arrays.

Currently, there is no way to use multiview to render to a multisampled backbuffer, so you should create contexts with antialias: false . However, the Oculus browser (6+) also supports multisampling using the OCULUS_multiview extension. See also this WebGL issue .

常量

This extension exposes 4 constants that can be used in getParameter() or getFramebufferAttachmentParameter() .

FRAMEBUFFER_ATTACHMENT_TEXTURE_NUM_VIEWS_OVR
Number of views of the framebuffer object attachment.
FRAMEBUFFER_ATTACHMENT_TEXTURE_BASE_VIEW_INDEX_OVR
Base view index of the framebuffer object attachment.
MAX_VIEWS_OVR
The maximum number of views. Most VR headsets have two views, but there are prototypes of headset with ultra-wide FOV using 4 views which is currently the maximum number of views supported by multiview.
FRAMEBUFFER_INCOMPLETE_VIEW_TARGETS_OVR
If baseViewIndex is not the same for all framebuffer attachment points where the value of FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE 不是 NONE , the framebuffer is considered incomplete. Calling checkFramebufferStatus for a framebuffer in this state returns FRAMEBUFFER_INCOMPLETE_VIEW_TARGETS_OVR .

方法

framebufferTextureMultiviewOVR()
Simultaneously renders to multiple elements of a 2D texture array.

范例

This example is taken from the specification . See also this three.js demo for a live multiview example.

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;
}
					

规范

规范 状态
OVR_multiview2 Community Approved

浏览器兼容性

更新 GitHub 上的兼容性数据
Desktop Mobile
Chrome Edge Firefox Internet Explorer Opera Safari Android webview Chrome for Android Firefox for Android Opera for Android Safari on iOS Samsung Internet
OVR_multiview2 Chrome 75
Alternate Name
75
Alternate Name
Alternate Name Uses the non-standard name: OVRMultiview2
不支持 70 — 75
Alternate Name
Alternate Name Uses the non-standard name: WebGLMultiview
Edge 79
Alternate Name
79
Alternate Name
Alternate Name Uses the non-standard name: OVRMultiview2
Firefox 71 IE No Opera No Safari No WebView Android 75
Alternate Name
75
Alternate Name
Alternate Name Uses the non-standard name: OVRMultiview2
不支持 70 — 75
Alternate Name
Alternate Name Uses the non-standard name: WebGLMultiview
Chrome Android 75
Alternate Name
75
Alternate Name
Alternate Name Uses the non-standard name: OVRMultiview2
不支持 70 — 75
Alternate Name
Alternate Name Uses the non-standard name: WebGLMultiview
Firefox Android No Opera Android No Safari iOS No Samsung Internet Android 11.0
Alternate Name
11.0
Alternate Name
Alternate Name Uses the non-standard name: OVRMultiview2
不支持 10.0 — 11.0
Alternate Name
Alternate Name Uses the non-standard name: WebGLMultiview
framebufferTextureMultiviewOVR Chrome 75
75
不支持 70 — 75
Alternate Name
Alternate Name Uses the non-standard name: framebufferTextureMultiviewWEBGL
Edge 79 Firefox 71 IE No Opera No Safari No WebView Android 75
75
不支持 70 — 75
Alternate Name
Alternate Name Uses the non-standard name: framebufferTextureMultiviewWEBGL
Chrome Android 75
75
不支持 70 — 75
Alternate Name
Alternate Name Uses the non-standard name: framebufferTextureMultiviewWEBGL
Firefox Android No Opera Android No Safari iOS No Samsung Internet Android 11.0
11.0
不支持 10.0 — 11.0
Alternate Name
Alternate Name Uses the non-standard name: framebufferTextureMultiviewWEBGL

图例

完整支持
完整支持
不支持
不支持
使用非标名称。

另请参阅