glGenTextures returns glDeleteTextures 后不久的未定义纹理
glGenTextures returns an undefined texture soon after glDeleteTextures
我遇到了一个奇怪的问题,我以未定义但不知何故有效的纹理结尾。应用此纹理的网格是黑色的。 glIsTexture(textureId)
这个纹理的方法 returns 1 (!) 但纹理显然是错误的。它有未定义的大小。
我的 iOS 应用程序在很短的时间间隔内创建了多个纹理,但始终在主线程上。所描述的情况不寻常,难以重现,并且仅在以下特定情况下发生:
- 有使用
glDeleteTextures(1, &textureId)
,删除一个纹理id=N
- 在短时间内(~0.05 秒)使用了
glGenTextures(1, &textureId)
和函数 returns 一个新纹理,其 id = N 与最近删除的纹理完全相同。
在我看来,这就像 OpenGL 驱动程序试图创建一个新的纹理,而旧的纹理没有被完全擦除。这可能吗?
问题很简单 - 在调用 glTexImage2D
和设置纹理之前未绑定纹理。
我正在 OpenGL 库上使用一组包装器方法。它们的目的是减少驱动程序冗余状态更改的次数。其中一个包装器阻止将具有相同 ID 的纹理绑定到纹理单元,如果它之前被标记为绑定的话。
在某些情况下,当回收相同的 ID 时,包装器方法仍然是 "remembering" 旧的纹理 ID,并且再次防止绑定。
重新假设 - 在这种情况下,glDeleteTextures
后跟 glGenTextures
.
完全没有问题
我遇到了一个奇怪的问题,我以未定义但不知何故有效的纹理结尾。应用此纹理的网格是黑色的。 glIsTexture(textureId)
这个纹理的方法 returns 1 (!) 但纹理显然是错误的。它有未定义的大小。
我的 iOS 应用程序在很短的时间间隔内创建了多个纹理,但始终在主线程上。所描述的情况不寻常,难以重现,并且仅在以下特定情况下发生:
- 有使用
glDeleteTextures(1, &textureId)
,删除一个纹理id=N - 在短时间内(~0.05 秒)使用了
glGenTextures(1, &textureId)
和函数 returns 一个新纹理,其 id = N 与最近删除的纹理完全相同。
在我看来,这就像 OpenGL 驱动程序试图创建一个新的纹理,而旧的纹理没有被完全擦除。这可能吗?
问题很简单 - 在调用 glTexImage2D
和设置纹理之前未绑定纹理。
我正在 OpenGL 库上使用一组包装器方法。它们的目的是减少驱动程序冗余状态更改的次数。其中一个包装器阻止将具有相同 ID 的纹理绑定到纹理单元,如果它之前被标记为绑定的话。
在某些情况下,当回收相同的 ID 时,包装器方法仍然是 "remembering" 旧的纹理 ID,并且再次防止绑定。
重新假设 - 在这种情况下,glDeleteTextures
后跟 glGenTextures
.