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

瀏覽器相容性

另見