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

浏览器兼容性

另见