什么是绘图缓冲区?

What are drawBuffers?

关于clearBuffer[fiuv]opengl docs as well as OpenGL ES docs状态:

If buffer is GL_COLOR, a particular draw buffer GL_DRAW_BUFFERi is specified by passing i as drawbuffer

确实,WebGL spec 定义了 DRAW_BUFFER0 的值 .. DRAW_BUFFER15

但是这些东西是什么?我听说过帧缓冲区和渲染缓冲区……但什么是绘制缓冲区?我该如何创建一个?与帧缓冲区有什么关系?如果我有一些使用多个帧缓冲区的延迟渲染管道,我怎么知道我应该清除哪一个?

注意:这可能看起来像 Regarding drawBuffer in glClearBufferiv 的重复,但这个问题是旧问题,在 OpenGL 下标记,并且没有完全回答相同的问题

帧缓冲区有附件。当帧缓冲区是当前绑定的 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
]);

请注意,这些设置是当前绑定的帧缓冲区状态的一部分。它们不是全局设置。 (当您在没有帧缓冲区绑定的情况下调用上面的函数时,canvas 本身有一组这种状态)

同样,您可以调用gl.clearBufferXXX 来清除当前绑定的帧缓冲区的特定附件。例如清除第 3 个附件,如

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) 获取当前绑定的帧缓冲区的绘制缓冲区设置。