OVR\_multiview2 extension
=========================

The `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:

* Multiview on WebXR
* Multiview in babylon.js
* Optimizing Virtual Reality: Understanding Multiview
* Multiview WebGL Rendering for Oculus Browser 6.0+

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

**Note:** 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.

Constants
---------

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` is not `NONE`, the framebuffer is considered incomplete. Calling `checkFramebufferStatus` for a framebuffer in this state returns `FRAMEBUFFER_INCOMPLETE_VIEW_TARGETS_OVR`.

Instance methods
----------------

`framebufferTextureMultiviewOVR()`

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

Examples
--------

This example is taken from the specification.


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


Also, see this three.js demo for a live multiview example.

Specifications
--------------

| Specification |
| --- |
| WebGL OVR\_multiview2 Extension Specification  |

Browser compatibility
---------------------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

See also
--------

* `WebGLRenderingContext.getExtension()`
* `WebGLRenderingContext.getParameter()`
* WebXR