Opengl 清除绘图帧缓冲区仅在连接到GL_COLOR_ATTACHMENT0时有效?
我正在尝试使用DRAW framebuffer(如所建议的)初始化一个全为零的纹理。然而,我很困惑,我的绘图帧缓冲区只有在我将其附加到Opengl 清除绘图帧缓冲区仅在连接到GL_COLOR_ATTACHMENT0时有效?,opengl,textures,framebuffer,Opengl,Textures,Framebuffer,我正在尝试使用DRAW framebuffer(如所建议的)初始化一个全为零的纹理。然而,我很困惑,我的绘图帧缓冲区只有在我将其附加到GL\u COLOR\u ATTACHMENT0时才被清除: int levels = 2; int potW = 2; int potH = 2; GLuint _potTextureName; glGenTextures(1, &_potTextureName); glBindTexture(GL_TEXTURE
GL\u COLOR\u 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\u COLOR\u 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
,我也试着使用glClearColor
和glClear
,但它们的行为方式都是一样的。我在这里遗漏了什么?事实证明,它与我以前绑定到的GL\u COLOR\u ATTACHMENT0
有关
在第二种情况下,GL\u COLOR\u ATTACHMENT0
已绑定到较小尺寸的纹理。值得注意的是,尽管纹理大小没有限制,但FBO的有效大小是所有绑定图像大小的交点。因此,在我的第二种情况下,如果绑定到GL\u COLOR\u ATTACHMENT1
的纹理(1)比绑定到GL\u COLOR\u ATTACHMENT0
的纹理(1)更大,那么无论我使用了什么清除操作(glClear
或glclearbufuffer*
),纹理(1)都只会被部分清除
第一种情况对我来说是可行的,因为我只有一个绑定到FBO的纹理,在GL\u COLOR\u ATTACHMENT0
中,第二个代码段使用了一个可能不同的值作为glTexStorage2D()
的格式参数。您使用的是什么OpenGL版本?我可以想象触发这种行为的一件事可能是,您仍然在颜色附件0处绑定了一些其他纹理/渲染缓冲区,这与新图像不匹配(例如采样数或层不匹配)。您应该检查帧缓冲区完整性状态。您还应该检查总账错误。@derhass,谢谢您指出完整性问题。结果证明是相关的,我只是把我的发现作为一个答案发布了出来。@RetoKoradi,谢谢。我编辑了我的问题以使它更清楚。我用的是4.1。