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

Clearing DRAW framebuffer only works if attached to GL_COLOR_ATTACHMENT0?

我正在尝试使用 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);

我尝试按照 here 的建议使用 glDrawBuffers,我也尝试使用 glClearColorglClear,但它们的行为方式相同。我在这里错过了什么?

原来和我之前绑定的东西有关GL_COLOR_ATTACHMENT0

在第二种情况下,GL_COLOR_ATTACHMENT0 已经绑定到 较小尺寸 的纹理。有一个和Framebuffer Completeness Rules相关的说明,虽然没有限制纹理大小,但是FBO的有效大小是所有绑定图片大小的交集。因此,在我的第二种情况下,如果绑定到 GL_COLOR_ATTACHMENT1 的纹理 (1) 比我绑定到 GL_COLOR_ATTACHMENT0 的纹理大,那么纹理 (1) 只会被部分清除,无论什么清除操作我使用了 (glClearglClearBuffer*).

第一种情况证明对我有用,因为我只有一个纹理绑定到 FBO,在 GL_COLOR_ATTACHMENT0