首页 > 解决方案 > WebGL Multi-Render Target:对于drawBuffers,gl.BACK有什么作用?

问题描述

我正在研究我的多重渲染目标管道,我在文档中遇到了我不完全理解的好奇心,并且谷歌搜索了一个小时并没有帮助我找到明确的答案。

您利用gl.drawBuffers([...])将着色器中使用的位置链接到帧缓冲区中的实际颜色附件。因此,大多数预期参数是有意义的:

gl.NONE - 使该位置的着色器输出不输出到 FBO 中的任何颜色附件

gl.COLOR_ATTACHMENT[0 - 15] - 使着色器位置输出到指定的颜色附件。

但是我们有这个神秘的目标(来自文档):

gl.BACK: Fragment shader output is written into the back color buffer.

我不认为我了解背景颜色缓冲区是什么,尤其是相对于当前附加的 FBO。据我所知,您在制作 FBO 时没有指定“背景颜色缓冲区”……那这是什么意思?这个“背景颜色缓冲区”是什么?

标签: webglwebgl2

解决方案


在 WebGL 中,后台缓冲区实际上是“画布”。之所以称为 ,是backbuffer因为有时会有一个前端缓冲区。WebGL 中的画布是双缓冲的。一个缓冲区是可见的,另一个是您当前正在绘制的缓冲区。

你不能使用[gl.BACK, gl_COLOR_ATTACHMENT0]

写入帧缓冲区时,每个条目只能是相同的附件或NONE. 例如,假设您有 4 个附件。那么你传递给的数组drawBuffers如下

gl.drawBuffers([
   gl.COLOR_ATTACHMENT0, // OR gl.NONE,
   gl.COLOR_ATTACHMENT1, // OR gl.NONE,
   gl.COLOR_ATTACHMENT2, // OR gl.NONE,
   gl.COLOR_ATTACHMENT3, // OR gl.NONE,
])

您不能交换附件。

gl.drawBuffers([
   gl.NONE,
   gl.COLOR_ATTACHMENT0, // !! ERROR! This has to be COLOR_ATTACHMENT1 or NONE
])

您不能gl.BACK gl.BACK仅在写入画布时使用,换句话说,帧缓冲区设置nullgl.bindFramebuffer(null);

gl.drawBuffers([
  gl.BACK, // OR gl.NONE
]);

注意:drawBuffers 状态是每个帧缓冲区(和画布)状态的一部分。看到这个这个


推荐阅读