我面临一个奇怪的问题,我以一个未定义的但以某种方式有效的纹理结束。应用此纹理的网格为黑色。此纹理的glIsTexture(textureId)
方法返回1(!),但纹理显然是错误的。它的大小不确定。
我的iOS应用程序会在短时间间隔内创建多个纹理,但始终在主线程上。所描述的情况是不寻常的,难以复制,并且仅在以下情况下发生:
glDeleteTextures(1, &textureId)
,删除纹理ID = N glGenTextures(1, &textureId)
并且该函数返回一个新纹理,其id = N与最近删除的纹理完全相同。这对我来说就像OpenGL驱动程序试图创建一个新纹理而旧的纹理没有完全擦除。这可能吗?
答案 0 :(得分:1)
问题很简单 - 在调用glTexImage2D
和设置纹理之前的未绑定纹理。
我在OpenGL库上使用了一组包装器方法。它们的目的是减少驱动程序的冗余状态更改次数。其中一个包装器阻止将具有相同ID的纹理绑定到纹理单元,如果它先前被标记为绑定。
在某些情况下,当相同的ID被回收时,包装方法仍然是“记住"旧的纹理ID和防止绑定再次。
重申 - 在这种情况下,glDeleteTextures
后面跟glGenTextures
完全没有问题。