Durante o desenvolvimento de uma aplicação OpenGL ES 2.0 para iOS, me deparei com o seguinte erro ao carregar texturas (usando GLKTextureLoader):
Error Domain=GLKTextureLoaderErrorDomain Code=8 “The operation couldn’t be completed. (GLKTextureLoaderErrorDomain error 8.)” UserInfo=0x75a3990 {GLKTextureLoaderGLErrorKey=1280, GLKTextureLoaderErrorKey=OpenGLES Error.}
O estranho é que o erro ocorria apenas com a primeira textura. Analisando meu código, vi que estava chamando glEnable(GL_TEXTURE_2D); antes de carregar todas as texturas. No entanto, por usar OGLES2.0 (programmable pipeline), não preciso ativar o estado GL_TEXTURE_2D (http://www.opengl.org/wiki/GLSL_:_common_mistakes#Enable_Or_Not_To_Enable).
Assim, remover a chamada do glEnable(GL_TEXTURE_2D) resolveu o problema.
Mas uma coisa me chamou a atenção: o GLKTextureLoader aparentemente usa o último valor da flag de erro do OpenGL e parece não fazer uma checagem simples para ignorar erros que não estejam relacionados com sua função. Dessa forma, caso a última flag de erro do OpenGL seja diferente de GL_NO_ERROR (antes de carregar a textura), o parâmetro error do GLKTextureLoader é preenchido de forma errada (pelo menos na minha interpretação).
Um teste que realizei foi o de manter glEnable(GL_TEXTURE_2D) (gerando flag de erro) e chamar glGetError() antes do GLKTextureLoader. Resultado: a textura foi carregada corretamente.
Segue o método que escrevi para carregar a textura (assumindo que mTexture é um membro da classe, do tipo GLKTextureInfo).
- (void)loadTexture:(NSString *)filename { // HACK: Clear GL error code before calling GLKTextureLoader, otherwise GLKTextureLoader will use the previous GL error... glGetError(); NSError *error = nil; NSString *filePath = [[NSBundle mainBundle] pathForResource:[filename stringByDeletingPathExtension] ofType:[filename pathExtension]]; mTexture = [GLKTextureLoader textureWithContentsOfFile:filePath options:nil error:&error]; if (error) { NSLog(@"Error loading texture \"%@\" from image: %@", filename, error); } else { NSLog(@"loadTexture: %@\nname: %d\ntarget: %d (GL_TEXTURE_2D? %d)\nwidth: %d\nheight: %d\nalpha state: %d\ntexture origin: %d\ncontains mipmaps: %d\n", filename, mTexture.name, mTexture.target, mTexture.target==GL_TEXTURE_2D, mTexture.width, mTexture.height, mTexture.alphaState, mTexture.textureOrigin, mTexture.containsMipmaps); } }