Tiện ích mở rộng OVR_multiview2

Khả dụng hạn chế

This feature is not Baseline because it does not work in some of the most widely-used browsers.

Tiện ích mở rộng OVR_multiview2 là một phần của WebGL API và thêm hỗ trợ kết xuất đồng thời vào nhiều view. Điều này đặc biệt hữu ích cho thực tế ảo (VR) và WebXR.

Để biết thêm thông tin, xem:

Các tiện ích mở rộng WebGL có sẵn thông qua phương thức WebGLRenderingContext.getExtension(). Để biết thêm thông tin, xem Sử dụng tiện ích mở rộng trong hướng dẫn WebGL.

Note: Hỗ trợ phụ thuộc vào trình điều khiển đồ họa của hệ thống (Windows+ANGLE và Android được hỗ trợ; Windows+GL, Mac, Linux không được hỗ trợ).

Tiện ích mở rộng này chỉ có sẵn cho các ngữ cảnh WebGL 2 vì nó cần GLSL 3.00 và mảng texture.

Hiện tại, không có cách nào sử dụng multiview để kết xuất vào backbuffer đa mẫu, vì vậy bạn nên tạo ngữ cảnh với antialias: false. Tuy nhiên, trình duyệt Oculus (6+) cũng hỗ trợ đa mẫu bằng tiện ích mở rộng OCULUS_multiview.

Hằng số

Tiện ích mở rộng này cung cấp 4 hằng số có thể được sử dụng trong getParameter() hoặc getFramebufferAttachmentParameter().

FRAMEBUFFER_ATTACHMENT_TEXTURE_NUM_VIEWS_OVR

Số lượng view của attachment đối tượng framebuffer.

FRAMEBUFFER_ATTACHMENT_TEXTURE_BASE_VIEW_INDEX_OVR

Chỉ số view cơ sở của attachment đối tượng framebuffer.

MAX_VIEWS_OVR

Số lượng view tối đa. Hầu hết tai nghe VR có hai view, nhưng có các nguyên mẫu tai nghe với FOV siêu rộng sử dụng 4 view là số lượng view tối đa được hỗ trợ bởi multiview.

FRAMEBUFFER_INCOMPLETE_VIEW_TARGETS_OVR

Nếu baseViewIndex không giống nhau cho tất cả các điểm gắn kết framebuffer khi giá trị FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE không phải NONE, framebuffer được coi là không hoàn chỉnh.

Phương thức phiên bản

framebufferTextureMultiviewOVR()

Kết xuất đồng thời vào nhiều phần tử của mảng texture 2D.

Ví dụ

Ví dụ này được lấy từ thông số kỹ thuật.

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.

Mã shader

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

Ngoài ra, xem bản demo three.js để có ví dụ multiview trực tiếp.

Thông số kỹ thuật

Thông số kỹ thuật
WebGL OVR_multiview2 Extension Specification

Tương thích trình duyệt

Xem thêm