XRWebGLLayer:getViewport() 方法

可用性有限

此特性不是基线特性,因为它在一些最广泛使用的浏览器中不起作用。

实验性: 这是一项实验性技术
在生产中使用此技术之前,请仔细检查浏览器兼容性表格

安全上下文: 此功能仅在安全上下文(HTTPS)中可用,且支持此功能的浏览器数量有限。

XRWebGLLayer 接口的 **getViewport()** 方法返回一个 XRViewport 对象,该对象应被用于将指定的 XRView 渲染到 WebGL 图层中。对于使用单个帧缓冲器来渲染左右眼画面的 WebXR 设备,返回的视口代表了场景应该被渲染到帧缓冲器中的哪个区域(对应于 view 表示的眼睛)。

语法

js
getViewport(view)

参数

view

一个 XRView 对象,表示要为其返回视口的视图。

返回值

一个 XRViewport 对象,表示一个视口,它将绘制限制在图层中对应于指定 view 的部分。

异常

InvalidStateError DOMException

如果指定的 view 不在活动的 XRFrame 中,或者该 XRFrameXRWebGLLayer 不属于同一个 WebXR session,则会抛出此错误。

示例

此示例部分展示了 requestAnimationFrame() 函数的回调可能的样子,使用 getViewport() 获取视口,以便将绘制限制在为当前正在渲染的眼睛的视角预留的区域内。

这样做是因为 XRViewerPose 返回的视图集中的每个视图都代表了眼睛对场景的一个视角。由于帧缓冲器被分成两半,一半用于左眼,一半用于右眼,因此将 WebGL 视口设置为与 WebXR 图层的视口匹配,可以确保在渲染当前眼睛姿势的场景时,它被渲染到帧缓冲器的正确一半。

js
function drawFrame(time, frame) {
  const session = frame.session;

  const pose = frame.getViewerPose(mainReferenceSpace);

  if (pose) {
    const glLayer = session.renderState.baseLayer;
    gl.bindFramebuffer(gl.FRAMEBUFFER, glLayer.framebuffer);

    gl.clearColor(0, 0, 0, 1.0);
    gl.clearDepth(1.0);
    gl.clear(gl.COLOR_BUFFER_BIT, gl.DEPTH_COLOR_BIT);

    for (const view of pose.views) {
      const viewport = glLayer.getViewport(view);
      gl.viewport(viewport.x, viewport.y, viewport.width, viewport.height);

      /* Render the scene now */
    }
  }
}

规范

规范
WebXR Device API
# dom-xrwebgllayer-getviewport

浏览器兼容性

另见