10

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

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

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

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


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;
}


4

8 回答 8

32

我也越来越

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

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

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

果然,GL 报告了一个错误,但它不需要我解决这个错误就GLKTextureLoader可以工作。仅仅得到 GL 错误就足够了。

于 2012-12-19T08:55:14.543 回答
4

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

于 2012-02-08T20:09:50.810 回答
3

也许您已经解决了这个问题,但是您是否使用了多个上下文?也许您应该使用共享组异步加载纹理。

所以不要使用 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
}];
于 2012-09-12T02:13:41.337 回答
3

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

于 2013-03-27T16:26:46.540 回答
2

好的,当我再次遇到错误时,我会再试一次。似乎发生的情况是,如果还有其他一些 glError 尚未处理,那么您将在第一次加载纹理时遇到问题。

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

于 2012-03-09T16:16:43.960 回答
1

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

于 2011-12-29T21:19:33.957 回答
1

我还发现在尝试创建具有大于最大纹理大小的图像的 2D 纹理时会出现此错误。对于最大尺寸,您可以查看Apple 的 Open GL ES Platform Notes,尽管这些对于较新的设备似乎并不正确,因此最好的办法是直接获取价值

于 2012-09-18T19:57:42.403 回答
0

I had very similar problem and it has been solved by calling setCurrentContext.

self.context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
[EAGLContext setCurrentContext:self.context];
于 2012-03-25T22:54:57.090 回答