为啥从 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:如果我将新的纹理绑定到另一个目标,纹理会发生啥?
尝试从帧缓冲区传递纹理会导致 L_INVALID_OPERATION:glDrawArrays:绘制的源纹理和目标纹理相同