gpt4 book ai didi

ios - glGenTextures 返回现有纹理名称

转载 作者:可可西里 更新时间:2023-11-01 04:44:17 25 4
gpt4 key购买 nike

我在 iOS 6.1.4、OpenGL ES 2 上,遇到 glGenTextures 返回纹理“名称”的奇怪行为,这些名称以前由 glGenTextures 返回。

具体来说,在初始化时,我遍历我的纹理并让 OpenGL 知道它们,如下所示:

// Generate the OpenGL texture objects
for (Object3D *object3D in self.objects3D)
{
[self installIntoOpenGLObject3D:object3D];
}

- (void)installIntoOpenGLObject3D:(Object3D *)object3D
{
GLuint nID;
glGenTextures(1, &nID);

Texture *texture = object3D.texture;
texture.identifier = nID;
glBindTexture(GL_TEXTURE_2D, nID);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, [texture width], [texture height], 0, GL_RGBA, GL_UNSIGNED_BYTE, (GLvoid*)[texture pngData]);
ARLogInfo(@"Installed texture '%@' with OpenGL identifier %d", texture.name, texture.identifier);
}

此时,我看到纹理名称如预期的那样 1, 2, 3, ... n

然而,稍后(异步网络调用返回后)我创建了新纹理并调用 installIntoOpenGLObject3D: 来安装它们。正是在稍后的时间,我看到 glGenTextures 返回了之前发布的名称。显然,这会导致应用渲染不正确的纹理。

文档,http://www.khronos.org/opengles/sdk/docs/man/xhtml/glGenTextures.xml ,建议:

Texture names returned by a call to glGenTextures are not returned by subsequent calls, unless they are first deleted with glDeleteTextures.

并且我没有调用 glDeleteTextures;然而文档也说:

it is guaranteed that none of the returned names was in use immediately before the call to glGenTextures.

这令人困惑,因为它暗示返回的名称如果未“使用”则可能相同。据我了解,通过为纹理调用 glBindTexture 满足“正在使用”的概念,但是,有些地方是错误的。

我的另一个想法可能是 EAGLContext 在对 glGenTextures 的第一组调用之间的某处发生了变化,但是,唉,在调试器中单步执行告诉我上下文是不变。

作为一个(也许是愚蠢的)hackish 变通方法,我自己尝试确保纹理名称是唯一的,如下所示,但是我只是以一个我不跟踪的纹理名称结束,但仍然代表不同的纹理,所以这种方法不提供解决方法:

- (void)installIntoOpenGLObject3D:(Object3D *)object3D
{
if (!self.object3DTextureIdentifiers)
{
self.object3DTextureIdentifiers = [NSMutableSet set];
}

GLuint nID;
NSNumber *idObj;
do {
glGenTextures(1, &nID);
GLboolean isTexture = glIsTexture(nID);
idObj = [NSNumber numberWithUnsignedInt:nID];
} while ([self.object3DTextureIdentifiers containsObject:idObj]);

[self.object3DTextureIdentifiers addObject:idObj];

Texture *texture = object3D.texture;
texture.identifier = nID;
glBindTexture(GL_TEXTURE_2D, nID);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, [texture width], [texture height], 0, GL_RGBA, GL_UNSIGNED_BYTE, (GLvoid*)[texture pngData]);
ARLogInfo(@"Installed texture '%@' with OpenGL identifier %d", texture.name, texture.identifier);
}

关于为什么 glGenTextures 返回它之前返回的名称有什么想法吗?

最佳答案

经过多次调试,我认为根本原因在于线程。

虽然我确定 glGenTextures 仅从一个线程(主线程)调用,但事实证明,对其他 OpenGL 方法的调用是在另一个线程上调用的。重构使对 glGenTextures 的调用也仅发生在其他线程(非主线程)上似乎可以解决该问题。

关于ios - glGenTextures 返回现有纹理名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17221021/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com