Alex Rivera | Logout

GLKTextureLoader fails when loading a certain texture the first time, but succeeds the second time

Asked 2011-12-23T00:04:56.837
10

I'm making an iPhone application with OpenGL ES 2.0 using the GLKit. I'm using GLKTextureLoader to load textures synchronously.

The problem is that for a certain texture, it fails to load it the first time. It gives this error:

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

For this error code, the apple documentation says the following:


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

(not very much).

Could I be trying to load the texture while the opengl context is in some busy state or something like that?

Notes:

  • Before getting to load this texture I load other textures and those work on the first try. Also, the exact same texture file will load ok on the second try.
  • There should be enough free video memory as I have only a couple of textures loaded before this one.
  • The texture is an uncompressed PNG with alpha, but I also tried with TGA (24bit & 32bit) with no luck.

Any ideas are welcomed, thanks

EDIT:

More info:

  • the opengl context is shared between all my screens. I'm doing this to keep my shaders and textures loaded between screens.

  • the problem above happens when I go to my second screen. In the first screen I draw textured stuff with no problems (other textures though).

  • The problem above happens when I load my content (game entities) in the game world. Each entity tries to load the texture. I have a simple caching system that loads the texture only once and then returns the same id for all other entities. I'm loading the entities synchronously, in one method. The first entity fails to load the texture then comes the second and succeeds and then the third one gets the cached id.

  • I am calling the lo

Edit
Report

3 Answers

4

I got this when enabling textures before loading the texture. Simply moved glEnable(GL_TEXTURE) after the loading and the issue was gone.

answered 2012-02-08T20:09:50.810
3

Maybe you've resolved this, but are you using multiple contexts? maybe you should be loading your texture asynchronously with sharegroup.

so instead of using tex = [GLKTextureLoader textureWithContentsOfFile:bundlepath options:options error:&error];

use something like:

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
}];
answered 2012-09-12T02:13:41.337
3

I had a similar problem. Is was caused by a texture that had width / height not power of 2. GLKTextureLoader failed on loading this and the following images. Checking glGetError() after each texture load revealed the troublemakers :-).

answered 2013-03-27T16:26:46.540

Your Answer