清除DRAW帧缓冲区只有在附加到GL_COLOR_ATTACHMENT0时才有效吗?

时间:2015-05-11 09:08:10

标签: opengl textures clear framebuffer

我正在尝试使用全局零初始化纹理,使用this post建议的DRAW帧缓冲区。但是,我很困惑我的DRAW帧缓冲区只有在我将其附加到GL_COLOR_ATTACHMENT0时才会被清除:

    int levels = 2;
    int potW = 2; int potH = 2;
    GLuint _potTextureName;
    glGenTextures(1, &_potTextureName);
    glBindTexture(GL_TEXTURE_2D, _potTextureName);
    glTexStorage2D(GL_TEXTURE_2D, levels, GL_RGBA32F, potW, potH);
    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, _potTextureName, 0);
    glDrawBuffer(GL_COLOR_ATTACHMENT0);

    GLuint clearColor[4] = {0,0,0,0};
    glClearBufferuiv(GL_COLOR, 0, clearColor);

修改要使用GL_COLOR_ATTACHMENT1的代码段,保留其他内容,不会清除帧缓冲区:

    int levels = 2;
    int potW = 2; int potH = 2;
    GLuint _potTextureName;
    glGenTextures(1, &_potTextureName);
    glBindTexture(GL_TEXTURE_2D, _potTextureName);
    glTexStorage2D(GL_TEXTURE_2D, levels, GL_RGBA32F, potW, potH);
    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D, _potTextureName, 0);
    glDrawBuffer(GL_COLOR_ATTACHMENT1);

    GLuint clearColor[4] = {0,0,0,0};
    glClearBufferuiv(GL_COLOR, 0, clearColor);

我尝试使用glDrawBuffers代替建议here,我也尝试使用glClearColorglClear,但它们的行为方式相同。我在这里缺少什么?

1 个答案:

答案 0 :(得分:0)

事实证明,它与我之前绑定到GL_COLOR_ATTACHMENT0的内容有关。

在第二种情况下,GL_COLOR_ATTACHMENT0已绑定到较小尺寸的纹理。有一个与Framebuffer Completeness Rules相关的注释虽然对纹理大小没有限制,但FBO的有效大小是所有绑定图像大小的交点。因此,在我的第二种情况下,如果绑定到GL_COLOR_ATTACHMENT1的纹理(1)大于我绑定到GL_COLOR_ATTACHMENT0的纹理(1),则纹理(1)将仅部分清除,无论清除操作是什么我使用了(glClearglClearBuffer*)。

第一个案例对我有用,因为我在GL_COLOR_ATTACHMENT0只有一个绑定到FBO的纹理。

相关问题