XRWebGLLayer: framebuffer 属性

实验性: 这是一个 实验性技术
在生产环境中使用此功能之前,请仔细查看 浏览器兼容性表格

安全上下文:此功能仅在 安全上下文(HTTPS)中可用,在某些或所有 支持的浏览器 中。

只读 XRWebGLLayer 属性 framebuffer 是一个不透明的 WebGLFramebuffer,如果正在使用 XR 合成器,则用于缓冲渲染的图像。否则,此属性的值为 null。不透明帧缓冲区在功能上几乎与标准 WebGL 帧缓冲区相同,除了下面“不透明帧缓冲区有何特殊之处”部分中介绍的差异。

一个表示帧缓冲区的 WebGLFramebuffer 对象,3D 场景正在其中渲染,如果会话禁用了 XR 合成器,则为 null

使用说明

不透明帧缓冲区有何特殊之处

framebuffer 属性表示的帧缓冲区是不透明的。因此,它的行为在几个方面与标准 WebGL 上下文不同。这些差异导致不透明帧缓冲区表现得更像默认的 WebGL 帧缓冲区。

  • 不透明帧缓冲区可能支持 抗锯齿,即使在 WebGL 1.0 下也是如此,而 WebGL 1.0 通常不支持。
  • 不透明帧缓冲区的附件(缓冲区等)无法检查或更改。在不透明帧缓冲区上调用诸如 framebufferTexture2D()framebufferRenderbuffer()deleteFramebuffer()getFramebufferAttachmentParameter() 等函数会导致 WebGL 错误 INVALID_OPERATION (0x0502)。
  • 不透明帧缓冲区被认为是不完整的,并且除了在执行 requestAnimationFrame() 回调时之外,无法用于渲染。尝试清除、绘制或读取帧缓冲区会导致 WebGL INVALID_FRAMEBUFFER_OPERATION 错误 (0x0506)。在动画帧回调之外的 WebGL 上下文中调用 checkFramebufferStatus() 会导致报告 WebGL FRAMEBUFFER_UNSUPPORTED 错误 (0x8CDD)。
  • 使用 depth 属性设置为 false 初始化的不透明帧缓冲区将没有深度缓冲区,并且将仅依靠坐标来确定距离。
  • 在不指定 stencil 属性的情况下初始化的不透明帧缓冲区将没有模板缓冲区。
  • 除非在创建图层时 alpha 属性为 true,否则不透明帧缓冲区将没有可用的 alpha 通道。
  • XR 合成器假设不透明帧缓冲区使用预乘 alpha 的颜色,无论 WebGL 上下文的 premultipliedAlpha 上下文属性是否设置。

注意:为了使浏览器被解释为具有完整的 WebGL 支持,不需要支持 depthstencil 属性。

新帧缓冲区的默认配置

创建新的 XRWebGLLayer 时,其新帧缓冲区的初始化方式与任何 WebGL 接口的默认帧缓冲区相同。

  • 颜色缓冲区配置为将其清除值设置为颜色 (0, 0, 0, 0)(表示透明黑色)。
  • 深度缓冲区的清除值为 1.0。
  • 模板缓冲区填充为 0。

示例

此示例获取会话的 XRWebGLLayer,然后将其帧缓冲区传递到 WebGL 上下文的 bindFramebuffer() 函数中。

js
let glLayer = xrSession.renderState.baselayer;
gl.bindFramebuffer(gl.FRAMEBUFFER, glLayer.framebuffer);

规范

规范
WebXR 设备 API
# dom-xrwebgllayer-framebuffer

浏览器兼容性

BCD 表格仅在启用 JavaScript 的浏览器中加载。

另请参阅