关于 clearBuffer[fiuv]
的 opengl docs 和 OpenGL ES docs 状态:
如果缓冲区是 GL_COLOR,则通过将 i 作为绘制缓冲区传递来指定特定的绘制缓冲区 GL_DRAW_BUFFERi
确实,WebGL spec 定义了 DRAW_BUFFER0
.. DRAW_BUFFER15
但是这些东西是什么?我听说过帧缓冲区和渲染缓冲区……但什么是绘制缓冲区?我如何创建一个?与帧缓冲区有什么关系?如果我有一些使用多个帧缓冲区的延迟渲染管道,我怎么知道我应该清除哪一个?
注意:这可能看起来像 Regarding drawBuffer in glClearBufferiv 的重复,但这个问题很老,在 OpenGL 下标记,并没有完全回答相同的问题
答案 0 :(得分:0)
帧缓冲区有附件。当帧缓冲区是当前绑定的 DRAW_FRAMEBUFFER
时,这些附件也称为“绘制缓冲区”,因为它们是将被绘制到的缓冲区。
有一个函数 gl.drawBuffers
可让您选择实际写入哪些附件
gl.drawBuffers([
gl.COLOR_ATTACHMENT0, // draw to the first attachment
gl.NONE, // don't draw to the 2nd attachment,
gl.COLOR_ATTACHMENT2, // draw to the 3rd attachment
]);
请注意,这些设置是当前绑定的帧缓冲区状态的一部分。它们不是全局设置。 (当你在没有帧缓冲区绑定的情况下调用上面的函数时,画布本身有一组这种状态)
同样,您可以调用 gl.clearBufferXXX
来清除当前绑定的帧缓冲区的特定附件。例如清除第三个附件
const drawbuffer = 2
gl.clearBufferfv(gl.COLOR, drawBuffer, [1, 0, 0, 1]);
然后将清除当前绑定的 DRAW_FRAMEBUFFER
上的第 3 个颜色附件。 (0为第一个,1为第二个,2为第三个附件)
常量 DRAW_BUFFER0
... DRAW_BUFFER15
的唯一用途是查询由 gl.drawBuffers
设置的值。例如。 gl.getParameter(gl.DRAW_BUFFER2)
获取当前绑定的帧缓冲区的绘制缓冲区设置。