第一次加载某个纹理时GLKTextureLoader失败,但第二次加载成功

时间:2011-12-23 00:04:57

标签: iphone opengl-es ios5 opengl-es-2.0 glkit

我正在使用GLKit制作一个使用OpenGL ES 2.0的iPhone应用程序。我正在使用GLKTextureLoader同步加载纹理。

问题是对于某种纹理,它无法在第一次加载它。它给出了这个错误:

The operation couldn’t be completed. (GLKTextureLoaderErrorDomain error 8.)

对于此错误代码,Apple文档说明如下:


GLKTextureLoaderErrorUncompressedTextureUpload
An uncompressed texture could not be uploaded.
Available in iOS 5.0 and later.
Declared in GLKTextureLoader.h.

(不是很多)。

当opengl上下文处于某种繁忙状态或类似情况时,我是否可以尝试加载纹理?

注意:

  • 在开始加载这个纹理之前,我加载了其他纹理,并在第一次尝试时工作。 此外,完全相同的纹理文件将在第二次尝试时加载正确。
  • 应该有足够的免费视频内存,因为在此之前我只加载了几个纹理。
  • 纹理是带有alpha的未压缩PNG,但我也试过TGA(24位和32位)而没有运气。

欢迎任何想法,谢谢

修改

更多信息:

  • opengl上下文在我的所有屏幕之间共享。我这样做是为了让我的着色器和纹理在屏幕之间加载。

  • 当我进入第二个屏幕时,会发生上述问题。在第一个屏幕中,我绘制没有问题的纹理东西(尽管其他纹理)。

  • 当我在游戏世界中加载我的内容(游戏实体)时,会发生上述问题。每个实体都尝试加载纹理。我有一个简单的缓存系统,只加载纹理一次,然后为所有其他实体返回相同的id。我在一种方法中同步加载实体。第一个实体无法加载纹理然后是第二个并且成功,然后第三个实体获得缓存的ID。

  • 我正在调用viewDidAppear中的加载实体方法,我尝试在加载任何实体之前添加一个睡眠2秒,但没有任何改变。

修改

纹理加载代码:


- (GLKTextureInfo *)loadTextureAtPath:(NSString*)path ofType:(NSString*)type withKey:(NSString *)key 
{
    GLKTextureInfo* tex;

    tex = [self textureWithKey:key];
    if (tex)
        return tex;

    NSDictionary * options = [NSDictionary dictionaryWithObjectsAndKeys:
                              [NSNumber numberWithBool:NO],
                              GLKTextureLoaderOriginBottomLeft, 
                              nil];

    NSError * error;    
    NSString *bundlepath = [[NSBundle mainBundle] pathForResource:path ofType:type];

    tex = [GLKTextureLoader textureWithContentsOfFile:bundlepath options:options error:&error];
    if (tex == nil) 
        DLOG_LOCAL(@"Error loading texture: %@", [error localizedDescription]);                
    else
        [textures setObject:tex forKey:key];

    return tex;
}


8 个答案:

答案 0 :(得分:31)

我也得到了

The operation couldn’t be completed. (GLKTextureLoaderErrorDomain error 8.)

在运行时后期加载纹理时,多个先前的纹理已成功加载到接近启动状态。我能够通过在GLKTextureLoader调用之前插入以下代码来解决问题:

NSLog(@"GL Error = %u", glGetError());

果然,GL报告了一个错误,但它并不要求我解决错误,以便GLKTextureLoader能够正常工作。仅仅获得GL错误就足够了。

答案 1 :(得分:4)

在加载纹理之前启用纹理时我得到了这个。加载后,只需移动glEnable(GL_TEXTURE),问题就消失了。

答案 2 :(得分:3)

也许你已经解决了这个问题,但是你在使用多个上下文吗?也许你应该与sharegroup异步加载你的纹理。

所以不要使用tex = [GLKTextureLoader textureWithContentsOfFile:bundlepath options:options error:& error];

使用类似的东西:

GLKTextureLoader *textureloader = [[GLKTextureLoader alloc] initWithSharegroup:self.eaglContext.sharegroup];
GLKTextureInfo *myTexture;
[textureloader textureWithCGImage:_currentForegroundImage.CGImage options:nil queue:nil completionHandler:^(GLKTextureInfo *textureInfo, NSError *error) {
        myTexture = textureInfo;
        if(error) {
            // log stuff
        }
        // do something
}];

答案 3 :(得分:3)

我有类似的问题。是由宽度/高度不是2的纹理引起的.GLKTextureLoader在加载此图像和以下图像时失败。在每次纹理加载后检查glGetError()会显示麻烦制造者: - )。

答案 4 :(得分:2)

好的,我会再次尝试这个,因为我再次遇到错误。似乎发生的情况是,如果还有一些尚未处理的glError,那么第一次使用纹理加载时会出现问题。

在加载失败的纹理之前,请检查glError,然后找出发生错误的位置。或者,您可以在加载纹理之前捕获opengl帧,并查看之前是否抛出了glError。当我遇到错误8时,这两次发生在我身上,一旦我修复了之前发生的错误,这两次错误就消失了。

答案 5 :(得分:1)

我遇到了同样的问题。我不确定为什么它只是出现了,因为它似乎同时发生了多个文件操作。例如,在第一次使用纹理加载器后立即执行文件加载(对于模型数据)会导致错误8弹出。我在程序中通过在第一次调用纹理加载器之后进行一些其他操作来修复它。

答案 6 :(得分:1)

我还发现在尝试创建图像大于最大纹理大小的2D纹理时会出现此错误。对于最大尺寸,您可以看到Apple's Open GL ES Platform Notes,虽然对于较新的设备看起来不正确,但最好的选择是get the value directly

答案 7 :(得分:0)

我遇到了类似的问题,通过调用setCurrentContext解决了这个问题。

self.context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
[EAGLContext setCurrentContext:self.context];