为啥从 FBO 解除绑定纹理会清除纹理?

Posted

技术标签:

【中文标题】为啥从 FBO 解除绑定纹理会清除纹理?【英文标题】:Why does unbinding a texture from a FBO clear the texture?为什么从 FBO 解除绑定纹理会清除纹理? 【发布时间】:2011-12-23 22:27:39 【问题描述】:

我在渲染到纹理操作时遇到了一些问题。我创建了一个 FBO,附加纹理,渲染它,一切都很好,但是当我尝试通过再次调用 glFramebufferTexture2DEXT 将附加纹理更改为 0 或新句柄时,我附加的纹理变为空白(所有像素值重置为 (0, 0, 0, 0))。

The documentation 并没有说这应该发生,这对我来说有点麻烦,因为我需要保留这个纹理中的信息。有谁知道为什么会发生这种情况,以及如何预防或解决它?

【问题讨论】:

听起来像是驱动程序错误,但我们需要查看您的代码才能确定。 @Nicol:真的没什么可看的。我将纹理绑定到 FBO,我调用 glDrawArrays 几次以在其上进行渲染,然后尝试绑定不同的纹理。我已经在 gDEBUgger 中验证了它。就在我打电话给glFramebufferTexture2DEXT 之前,绑定到FBO 的纹理充满了数据。紧接着,它是空白的。 你确定你没有在其他地方删除纹理对象吗? 【参考方案1】:

刚刚遇到了几乎相同的情况。最终的解决方案是在创建纹理时,我们必须确保设置 TexParameters。

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

根据https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glTexParameter.xhtml,GL_TEXTURE_MIN_FILTER 默认为 GL_NEAREST_MIPMAP_LINEAR,但我们没有进行 mipmapping。我不确定为什么这会导致纹理看起来被擦除,但我们就是这样做来修复它的。

【讨论】:

以上是关于为啥从 FBO 解除绑定纹理会清除纹理?的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL:如果我将新的纹理绑定到另一个目标,纹理会发生啥?

OpenGL 渲染到 FBO

尝试从帧缓冲区传递纹理会导致 L_INVALID_OPERATION:glDrawArrays:绘制的源纹理和目标纹理相同

为啥 OpenGL 缓冲区解除绑定顺序很重要? [复制]

为啥单击两次后我的事件侦听器与按钮解除绑定?

OpenGL:加载纹理会改变当前颜色