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

标签 ios opengl-es-2.0

我遇到了一个奇怪的问题,我以未定义但不知何故有效的纹理结尾。应用此纹理的网格是黑色的。此纹理的 glIsTexture(textureId) 方法返回 1 (!) 但纹理显然是错误的。它具有未定义的大小。

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

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

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

最佳答案

问题很简单 - 在调用 glTexImage2D 并设置纹理之前未绑定(bind)纹理。

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

在某些情况下,当相同的 ID 被回收时,包装方法仍然“记住”旧的纹理 ID 并再次阻止绑定(bind)。

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

关于ios - glGenTextures 在 glDeleteTextures 之后很快返回一个未定义的纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29660600/

相关文章:

ios - 为什么向我的应用程序添加多重采样会在第一帧卡住屏幕?

ios - iOS 上的 LibGDX FrameBuffer 怪癖

ios - Fabric 回答舍入 Int 值

ios - audiokit 停止触觉反馈

objective-c - 将渐变放在 tableview 单元格背景上

ios - 让和内存分配

opengl-es - YUV图像使用单个纹理还是多个纹理更好

iphone - glClear 对填充率影响大吗?

ios - Collection View 单元格内按钮的填充宽度

Android GLES20.glBlendEquation 不工作?