我有一个奇怪的错误。我使用glClearBufferfv(和它的DSA版本 - glClearNamedFramebufferfv)来清除FBO颜色附件。而我所看到的是,只有当我将drawBuffer param设置为零时才会清除绘制缓冲区。但它至少不是基于我对文档的理解而做出的。我的FBO分别在GL_COLOR_ATTACHMENT0
和GL_COLOR_ATTACHMENT1
有两个颜色附件。
以下是我的工作:
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, handle)
//want to clear second attachment
GLenum buffers[1];
buffers[0] = GL_COLOR_ATTACHMENT0 + 1;
glNamedFramebufferDrawBuffers(handle, 1, buffers));
glViewport(0, 0, w, h));
float color[4] = { 1.0f, 1.0f, 1.0f, 1.0f };
glClearNamedFramebufferfv(handle, GL_COLOR,1,color);
它没有清除第二个颜色附件。但如果我设置:
glClearNamedFramebufferfv(handle, GL_COLOR,0,color);
然后呢。
我在这些功能中遗漏了drawbuffer
param的内容吗?
在NVIDIA GTX960M上运行
PS:
我使用这种方法将纹理附加到我的FBO:
glNamedFramebufferTexture(handle, GL_COLOR_ATTACHMENT0 + 0, texHandle, 0));
glNamedFramebufferTexture(handle, GL_COLOR_ATTACHMENT0 + 1, texHandle, 0));
没有附件单位。附件设置是正确的,因为我看到绘图结果到底应该是什么。现在唯一的问题是清除右渲染目标。
答案 0 :(得分:1)
错误观念已在问题标题中表达:
glClearBufferfv
未清除指定的颜色附件
一个不指定glClearBuffer*
/ glClearNamedFramebuffer*
的颜色附件,但指向当前所选绘制缓冲区的索引。
绘制缓冲区的集合是每个FBO状态,因此当你执行
时buffers[0] = GL_COLOR_ATTACHMENT0 + 1; glNamedFramebufferDrawBuffers(handle, 1, buffers));
你确实将FBO的绘制缓冲区设置为一组:
{GL_COLOR_ATTACHMENT1}
只有一个绘制缓冲区,因此唯一有效的绘制缓冲区索引为0,清除绘制缓冲区索引0正确清除GL_COLOR_ATTACHMENT1
。