XRWebGLLayer:framebuffer 属性

可用性有限

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

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

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

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

一个 WebGLFramebuffer 对象,表示正在渲染 3D 场景的 framebuffer,或者如果会话禁用了 XR 合成器,则为 null

用法说明

不透明 framebuffer 的特殊之处

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

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

注意: 浏览器不必支持 depthstencil 属性,才能被视为拥有完整的 WebGL 支持。

新 framebuffer 的默认配置

创建新的 XRWebGLLayer 后,其新 framebuffer 的初始化方式与任何 WebGL 接口的默认 framebuffer 相同。

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

示例

此示例获取会话的 XRWebGLLayer,然后将其 framebuffer 传递给 WebGL 上下文的 bindFramebuffer() 函数。

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

规范

规范
WebXR Device API
# dom-xrwebgllayer-framebuffer

浏览器兼容性

另见