XRWebGLLayer: framebuffer 属性
只读 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()
回调时之外,无法用于渲染。尝试清除、绘制或读取帧缓冲区会导致 WebGLINVALID_FRAMEBUFFER_OPERATION
错误 (0x0506
)。在动画帧回调之外的 WebGL 上下文中调用checkFramebufferStatus()
会导致报告 WebGLFRAMEBUFFER_UNSUPPORTED
错误 (0x8CDD
)。 - 使用
depth
属性设置为false
初始化的不透明帧缓冲区将没有深度缓冲区,并且将仅依靠坐标来确定距离。 - 在不指定
stencil
属性的情况下初始化的不透明帧缓冲区将没有模板缓冲区。 - 除非在创建图层时
alpha
属性为true
,否则不透明帧缓冲区将没有可用的 alpha 通道。 - XR 合成器假设不透明帧缓冲区使用预乘 alpha 的颜色,无论 WebGL 上下文的
premultipliedAlpha
上下文属性是否设置。
注意:为了使浏览器被解释为具有完整的 WebGL 支持,不需要支持 depth
和 stencil
属性。
新帧缓冲区的默认配置
创建新的 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 的浏览器中加载。