我现在正在学习帧缓冲器,我只是不明白Color附件的作用。我理解framebuffers。
第二个参数的重点是什么:
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textureColorBuffer, 0);
当我将其更改为COLOR_ATTACHMENT1时,为什么没有任何内容可以绘制到我的帧缓冲区?
如何通过将纹理设置为颜色附件1来绘制到帧缓冲区? 为什么使用多个颜色附件会有用? 它是否类似于同时绘制多个纹理的glActiveTexture(GL_TEXTUREi)概念?
我只是想了解更多开放的gl。感谢。
答案 0 :(得分:8)
是的,帧缓冲区可以有多个颜色附件,而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。