我正在尝试使用全局零初始化纹理,使用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,我也尝试使用glClearColor
和glClear
,但它们的行为方式相同。我在这里缺少什么?
答案 0 :(得分:0)
事实证明,它与我之前绑定到GL_COLOR_ATTACHMENT0
的内容有关。
在第二种情况下,GL_COLOR_ATTACHMENT0
已绑定到较小尺寸的纹理。有一个与Framebuffer Completeness Rules相关的注释虽然对纹理大小没有限制,但FBO的有效大小是所有绑定图像大小的交点。因此,在我的第二种情况下,如果绑定到GL_COLOR_ATTACHMENT1
的纹理(1)大于我绑定到GL_COLOR_ATTACHMENT0
的纹理(1),则纹理(1)将仅部分清除,无论清除操作是什么我使用了(glClear
或glClearBuffer*
)。
第一个案例对我有用,因为我在GL_COLOR_ATTACHMENT0
只有一个绑定到FBO的纹理。