glGenTextures在glDeleteTextures之后很快返回一个未定义的纹理

时间:2015-04-15 20:47:53

标签: ios opengl-es-2.0

我面临一个奇怪的问题,我以一个未定义的但以某种方式有效的纹理结束。应用此纹理的网格为黑色。此纹理的glIsTexture(textureId)方法返回1(!),但纹理显然是错误的。它的大小不确定。

我的iOS应用程序会在短时间间隔内创建多个纹理,但始终在主线程上。所描述的情况是不寻常的,难以复制,并且仅在以下情况下发生:

  • 使用glDeleteTextures(1, &textureId),删除纹理ID = N
  • 在短时间内(~0.05s)使用glGenTextures(1, &textureId)并且该函数返回一个新纹理,其id = N与最近删除的纹理完全相同。

这对我来说就像OpenGL驱动程序试图创建一个新纹理而旧的纹理没有完全擦除。这可能吗?

1 个答案:

答案 0 :(得分:1)

问题很简单 - 在调用glTexImage2D和设置纹理之前的未绑定纹理。

我在OpenGL库上使用了一组包装器方法。它们的目的是减少驱动程序的冗余状态更改次数。其中一个包装器阻止将具有相同ID的纹理绑定到纹理单元,如果它先前被标记为绑定。

在某些情况下,当相同的ID被回收时,包装方法仍然是“记住"旧的纹理ID和防止绑定再次。

重申 - 在这种情况下,glDeleteTextures后面跟glGenTextures完全没有问题。