什么是绘制缓冲区?

时间:2021-01-05 12:04:01

标签: webgl webgl2

关于 clearBuffer[fiuv]opengl docsOpenGL ES docs 状态:

<块引用>

如果缓冲区是 GL_COLOR,则通过将 i 作为绘制缓冲区传递来指定特定的绘制缓冲区 GL_DRAW_BUFFERi

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

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

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

1 个答案:

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