glClearBufferfv不清除指定的颜色附件

时间:2018-05-12 20:38:48

标签: c++ opengl

我有一个奇怪的错误。我使用glClearBufferfv(和它的DSA版本 - glClearNamedFramebufferfv)来清除FBO颜色附件。而我所看到的是,只有当我将drawBuffer param设置为零时才会清除绘制缓冲区。但它至少不是基于我对文档的理解而做出的。我的FBO分别在GL_COLOR_ATTACHMENT0GL_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)); 

没有附件单位。附件设置是正确的,因为我看到绘图结果到底应该是什么。现在唯一的问题是清除右渲染目标。

1 个答案:

答案 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