Ios glGenTextures在glDeleteTextures之后立即返回未定义的纹理

Ios glGenTextures在glDeleteTextures之后立即返回未定义的纹理,ios,opengl-es-2.0,Ios,Opengl Es 2.0,我面临着一个奇怪的问题,在这里我以一个未定义但某种程度上有效的纹理结束。应用此纹理的网格为黑色。此纹理的glIsTexture(textureId)方法返回1(!),但纹理显然是错误的。它有未定义的大小 我的iOS应用程序在短时间间隔内创建多个纹理,但始终在主线程上。所描述的情况是不寻常的,难以再现,并且仅在以下特定情况下发生: 使用了glDeleteTextures(1,&textureId),删除纹理id=N 在短时间内(~0.05秒)将使用glGenTextures(1,&texture

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

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

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

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

问题很简单-在调用
glTexImage2D
并设置纹理之前是一个未绑定的纹理

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

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


重新赋值-在这种情况下,
glDeleteTextures
紧随其后的
glGenTextures

完全没有问题,听起来好像GL实现正在回收纹理ID。这有什么问题?应用的纹理显示为黑色的网格表示纹理设置有问题,并且着色器为每个纹理样本读取0。@节奏-循环ID非常好。问题是,在极少数情况下,当ID在短时间间隔内循环使用时,新纹理为黑色,没有定义尺寸,但有效(glIsTexture(textureId)返回1)。@James纹理设置相同,99.9%的纹理创建正确。在我描述的场景中,相同的设置失败(删除和生成之间的间隔很短,在同一个ID上操作-都在同一个线程中)。@Greg:嗯,不太清楚应用程序中发生了什么。既然您明确提到了一个主线程,那么是否还有其他线程可能与GL交互?而且,我真的不知道你期待什么
glGenTextures
不创建纹理对象,而是创建纹理名称(ID)。纹理对象是在ID首次绑定到纹理单元时创建的。这当然只会创建一个没有任何图像数据的空texutre对象。