glClearBufferfv 不清除指定的颜色附件

glClearBufferfv doesn't clear specified color attachment

本文关键字:颜色 清除 glClearBufferfv      更新时间:2023-10-16

我遇到了一个奇怪的错误。我正在使用glClearBufferfv(及其DSA版本 - glClearNamedFramebufferfv(来清除FBO颜色附件。我看到的是,只有当我将 drawBuffer 参数设置为零时,它才会清除绘制缓冲区。但这并不有意义,至少基于我对文档的理解。我的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参数的内容?

在 NVIDIA GTX960M上运行

附注:

我使用此方法将纹理附加到我的 FBO:

glNamedFramebufferTexture(handle, GL_COLOR_ATTACHMENT0 + 0, texHandle, 0));
glNamedFramebufferTexture(handle, GL_COLOR_ATTACHMENT0 + 1, texHandle, 0)); 

其中 no 是附件单元。附件设置是正确的,因为我看到的绘图结果正好在它们应该在的位置。现在唯一的问题是清除正确的呈现目标。

误解已经在问题标题中表达出来:

glClearBufferfv不清除指定的颜色附件

一个不是glClearBuffer*/glClearNamedFramebuffer*指定颜色附件,而是将索引放入当前选定的绘制缓冲区中。

绘制缓冲区集是每个 FBO 状态,因此当您这样做时

buffers[0] = GL_COLOR_ATTACHMENT0 + 1;
glNamedFramebufferDrawBuffers(handle, 1, buffers));

您确实将 FBO 的绘制缓冲区设置为一组:

{GL_COLOR_ATTACHMENT1}

只有一个绘制缓冲区,因此唯一有效的绘制缓冲区索引为 0,清除绘制缓冲区索引 0 会正确清除GL_COLOR_ATTACHMENT1