XRWebGLLayer:getNativeFramebufferScaleFactor() 靜態方法

可用性有限

此特性不是基線特性,因為它在一些最廣泛使用的瀏覽器中不起作用。

實驗性: 這是一項實驗性技術
在生產中使用此技術之前,請仔細檢查瀏覽器相容性表格

安全上下文: 此功能僅在安全上下文(HTTPS)中可用,且支援此功能的瀏覽器數量有限。

靜態方法 XRWebGLLayer.getNativeFramebufferScaleFactor() 返回一個浮點縮放因子,你可以將此因子乘以指定的 XRSession 的解析度,以獲得 WebXR 裝置的幀緩衝區的原生解析度。

在建立新的 XRWebGLLayer 時,可以使用此資訊來配置呼叫 XRWebGLLayer() 建構函式時指定的 layerInit 配置物件中的 framebufferScaleFactor。有關詳細資訊,請參閱 使用說明示例

如果縮放因子為 1.0,則幀緩衝區畫素與原生顯示畫素大小相同。如果縮放因子大於零,則幀緩衝區小於顯示器的原生尺寸,導致渲染到幀緩衝區後,輸出會放大以顯示在螢幕上。如果縮放因子小於零,則幀緩衝區比顯示器的原生解析度,導致幀緩衝區的內容被縮小以顯示在 XR 裝置上。這可能發生在使用超取樣或抗鋸齒技術來提高感知影像質量的顯示環境中。

語法

js
XRWebGLLayer.getNativeFramebufferScaleFactor(session)

引數

會話

要返回原生幀緩衝區縮放因子的 XRSession

返回值

一個浮點值,將其乘以 XRSession 推薦的幀緩衝區尺寸,即可獲得 XR 裝置的ವರೆಗೆ原生幀緩衝區解析度。如果會話已結束,此函式將返回 0.0。

用法說明

如果 XR 裝置的ವರೆಗೆ原生解析度與 XR 裝置的解析度匹配,則此函式返回的縮放因子將為 1.0。無論如何,將 XRSession 確定的推薦解析度乘以此值將得到 XR 硬體的ವರೆಗೆ實際原生解析度。

推薦的 WebGL 幀緩衝區解析度是包含裝置所需所有 XRView 的最佳估計解析度,同時為典型應用程式提供影像質量和效能之間的可接受平衡。

例如,考慮一個使用 2560x1440 畫素幀緩衝區的裝置(該緩衝區用於渲染左右眼各 1280x1440 畫素的兩個檢視)。考慮一個全尺寸看起來像這樣的幀緩衝區:

Diagram showing how a framebuffer is divided between two eyes' viewpoints

如果在此裝置上,由於 GPU 限制,瀏覽器需要降低影像質量以將效能提高到可接受的水平,它可能會選擇將解析度減半。在這種情況下,XRWebGLLayer.getNativeFramebufferScaleFactor() 返回的值將是 2.0。以下圖表展示了這種在檢視之間劃分幀緩衝區的方法:

Diagram showing frame buffer as scaled to half resolution

現在,幀緩衝區的寬度和高度是原來的 50%,導致總幀緩衝區大小為 1280x720 畫素,每隻眼睛的緩衝區一半為 640x720 畫素。現在我們可以看到代表這兩個檢視的每個視口(viewport)的座標:

Framebuffer and viewports with coordinates

由於每隻眼睛獲得一半的幀緩衝區,結果是左眼獲得緩衝區的一部分 640x720 畫素,視口的 xy 為 0,寬度為 640,高度為 720。右眼獲得幀緩衝區的另一半,其視口的 x 設定為 639。

渲染此場景的幀 時,我們會獲取檢視的視口並將其應用於 WebGL,然後渲染場景。這確保了我們渲染的場景不僅會匹配我們需要表達的視點(由姿勢中的位置和方向資料定義),而且渲染的輸出將僅限於眼睛正在繪製的幀緩衝區中的正確部分,而不管正在執行的任何縮放。

示例

在此示例中,我們請求裝置ವರೆಗೆ原生解析度的幀緩衝區,而不考慮任何效能問題。

js
function requestNativeScaleWebGLLayer(gl, xrSession) {
  return gl.makeXRCompatible().then(() => {
    let scaleFactor = XRWebGLLayer.getNativeFramebufferScaleFactor(xrSession);
    let glLayer = new XRWebGLLayer(xrSession, gl, {
      framebufferScaleFactor: scaleFactor,
    });
    xrSession.updateRenderState({ baseLayer: glLayer });
  });
}

這首先呼叫 WebGL 渲染上下文 函式 makeXRCompatible()。當返回的 Promise 解析後,我們繼續呼叫 XRWebGLLayergetNativeFramebufferScaleFactor() 靜態函式來獲取達到ವರೆಗೆ原生解析度所需的縮放因子,然後將其作為 layerInit 配置物件中 framebufferScaleFactor 屬性的值傳遞給 WebGLLayer() 建構函式。

這樣我們就得到一個新的 XRWebGLLayer 物件,它代表了可用於 XRSession 的渲染表面;我們透過呼叫其 updateRenderState() 方法,使用 XRRenderState 字典的 XRRenderState.baseLayer 屬性傳入新的 glLayer,將其設定為 xrSession 的渲染表面。結果是一個渲染上下文,如下圖所示:

Framebuffer and viewports with coordinates

每次迭代 XRViewerPoseviews 以進行渲染時,渲染迴圈都會獲取一個左眼 XRView,其左上角位於 (0, 0),寬度和高度為 1280x1440 畫素。獲取的右眼其左上角位於 1280, 0,寬度和高度相同:1280x1440。

規範

規範
WebXR Device API
# dom-xrwebgllayer-getnativeframebufferscalefactor

瀏覽器相容性

另見