清除 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
,我也尝试使用 glClearColor
和 glClear
,但它们的行为方式相同。我在这里错过了什么?
原来和我之前绑定的东西有关GL_COLOR_ATTACHMENT0
。
在第二种情况下,GL_COLOR_ATTACHMENT0
已经绑定到 较小尺寸 的纹理。有一个和Framebuffer Completeness Rules相关的说明,虽然没有限制纹理大小,但是FBO的有效大小是所有绑定图片大小的交集。因此,在我的第二种情况下,如果绑定到 GL_COLOR_ATTACHMENT1
的纹理 (1) 比我绑定到 GL_COLOR_ATTACHMENT0
的纹理大,那么纹理 (1) 只会被部分清除,无论什么清除操作我使用了 (glClear
或 glClearBuffer*
).
第一种情况证明对我有用,因为我只有一个纹理绑定到 FBO,在 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
,我也尝试使用 glClearColor
和 glClear
,但它们的行为方式相同。我在这里错过了什么?
原来和我之前绑定的东西有关GL_COLOR_ATTACHMENT0
。
在第二种情况下,GL_COLOR_ATTACHMENT0
已经绑定到 较小尺寸 的纹理。有一个和Framebuffer Completeness Rules相关的说明,虽然没有限制纹理大小,但是FBO的有效大小是所有绑定图片大小的交集。因此,在我的第二种情况下,如果绑定到 GL_COLOR_ATTACHMENT1
的纹理 (1) 比我绑定到 GL_COLOR_ATTACHMENT0
的纹理大,那么纹理 (1) 只会被部分清除,无论什么清除操作我使用了 (glClear
或 glClearBuffer*
).
第一种情况证明对我有用,因为我只有一个纹理绑定到 FBO,在 GL_COLOR_ATTACHMENT0
。