GL_COLOR_ATTACHMENT是什么作用?

9

我现在正在学习关于帧缓冲,但不明白颜色附件是用来干嘛的。我了解帧缓冲。

这段代码中第二个参数的目的是什么:

glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textureColorBuffer, 0);

当我将其更改为COLOR_ATTACHMENT1时,为什么没有任何东西绘制到我的帧缓冲区?

如果将纹理设置为颜色附件1,如何绘制到帧缓冲区? 使用多个颜色附件有什么用处? 这是否类似于glActiveTexture(GL_TEXTUREi)概念一次绘制多个纹理?

我只是想更好地了解OpenGL。谢谢。

1个回答

21

是的,帧缓冲对象可以拥有多个颜色附件。在调用glFramebufferTexture2D()函数时,第二个参数指定要设置的附件是哪一个。可以使用以下代码查询支持的最大颜色附件数:

GLint maxAtt = 0;
glGetIntegerv(GL_MAX_COLOR_ATTACHMENTS, &maxAtt);

所有实现所支持的最小值为8。

要选择要渲染到哪个缓冲区,您可以使用 glDrawBuffer()glDrawBuffers()。这两个调用之间唯一的区别是第一个调用只允许您指定一个缓冲区,而第二个调用支持多个缓冲区。

在您尝试的示例中,您可以通过以下任一方式将其呈现到 GL_COLOR_ATTACHMENT1

glDrawBuffer(GL_COLOR_ATTACHMENT1);
或者:
GLenum bufs[1] = {GL_COLOR_ATTACHMENT1};
glDrawBuffers(1, bufs);

默认值为GL_COLOR_ATTACHMENT0,这就解释了为什么您成功地渲染到附件0而从未使用此调用。绘制缓冲区列表是FBO状态的一部分。

要为多个颜色缓冲区生成输出,您需要在片段着色器中定义多个输出。

多个颜色缓冲区的一个常见用途(通常称为MRT =多重渲染目标的缩写)是延迟着色,其中用于着色计算的插值顶点属性存储在初始渲染传递中的多个缓冲区中。然后,在第二次传递中仅对可见像素执行实际的着色计算,使用第一次传递中产生的缓冲区中的属性值。有关此过程的更完整说明,请参见http://ogldev.atspace.co.uk/www/tutorial35/tutorial35.html


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接