2012-05-19 17 views
6

Laden von Texturen aus ViewDidLoad funktioniert gut. Aber wenn ich versuche, sie von der GLKViewController Aktualisierung zu laden, erhalte ich einen Fehler. Ich mache das, weil ich eine neue Hintergrundtextur austauschen möchte, ohne die Ansicht zu ändern.GLKTextureLoader schlägt beim Aufruf von Update fehl

Dies funktionierte vor dem letzten Upgrade. Vielleicht hatte ich Glück mit dem Timing. Ich vermute, dass es scheitert, weil ein Thread beschäftigt ist oder etwas?

Hier ist der Fehler vollständig.

Domain = GLKTextureLoaderErrorDomain Code = 8 "Der Vorgang konnte nicht abgeschlossen werden. (GLKTextureLoaderErrorDomain Fehler 8.)" Userinfo = 0x10b5b510 {GLKTextureLoaderGLErrorKey = 1282 GLKTextureLoaderErrorKey = OpenGL Fehler}

Die Frage ist also, kann ich eine Textur aus der Update-Funktion sicher laden? Oder muss ich meinen Ansatz überdenken und die gesamte Ansicht oder etwas neu laden?

Hier ist meine Funktion:

-(void) LoadTexture:(NSString *)texture textureInfo:(GLKTextureInfo**)textureInfo 
{ 
    NSString *path = [[NSBundle mainBundle] pathForResource:texture ofType:@"png"]; 
    NSError *error = nil; 

    (*textureInfo) = [GLKTextureLoader textureWithContentsOfFile:path options:nil error:&error]; 

    NSLog(@"path %@", path); 

    if(!(*textureInfo)) 
    { 
     NSLog(@"Failed to load texture %@ %@", texture, error); 
    } 
    else 
    { 
     NSLog(@"LOADED Texture %@ !!! YAY!!! ", texture); 
    } 
} 

Danke,

David

+0

Ich habe das gleiche Problem hier. Hast du eine Lösung gefunden? – hanno

+0

Nein, ich habe noch nicht untersucht. Es scheint, dass dieser synchrone Aufruf fehlschlagen kann, wenn eine Ressource belegt ist. Ich stelle mir vor, die Lösung besteht darin, asynchron zu laden, indem die längere Version dieser Funktion verwendet wird, in der Sie einen Beendigungshandler übergeben. Diese verzögerte Version bedeutet, dass Sie die Textur zu einem späteren Zeitpunkt erhalten werden, so dass es richtig gehandhabt werden muss, aber ich hoffe, dass dies die Lösung sein wird. - textureWithContentsOfFile: Optionen: queue: completionHandler: –

+1

Ich gab am Ende auf und benutze einfach die einfache alte glTexImage2D. – hanno

Antwort

0

Ich hatte ein ähnliches Problem zu Ihnen. Was ich getan habe, um das Problem zu beheben, war eine Klasse, die alle Texturen hatte, die ich für das ganze Spiel verwenden wollte. In viewDidLoad: habe ich die Klasse initialisiert und alle Texturen geladen. Wenn ich eine der Texturen verwenden musste, waren sie bereits geladen und das Problem trat nicht auf.

z. In viewDidLoad

GameTextures *textures = [GameTextures alloc] init]; 
[textures LoadAll]; 

LoadAll die Texturen alle später würde laden für Dann

verwenden, wenn Sie

eine Textur verwenden müssen
[myBackground setTexture: textures.backgroundTexture2]; 

Hope this half :)

1

Ich hatte ein Problem wie diese und die Arbeit um die Textur ohne den glktextureloader geladen wurde.

Hier einige Code zum Laden der Textur ohne GLKtextureLoader:

bool lPowerOfTwo = false; 

UIImage *image = [UIImage imageNamed:@"texture.png"]; 

GLuint width = CGImageGetWidth(image.CGImage); 
GLuint height = CGImageGetHeight(image.CGImage); 
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
void *imageData = malloc(height * width * 4); 
CGContextRef context = CGBitmapContextCreate(imageData, width, height, 8, 4 * width, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); 
CGColorSpaceRelease(colorSpace); 

CGContextClearRect(context, CGRectMake(0, 0, width, height)); 
CGRect bounds=CGRectMake(0, 0, width, height); 
CGContextScaleCTM(context, 1, -1); 
bounds.size.height = bounds.size.height*-1; 
CGContextDrawImage(context, bounds, image.CGImage); 

GLuint lTextId; 
glGenTextures(1, &lTextId); 
glBindTexture(GL_TEXTURE_2D, lTextId); 


glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, imageData); 

if(!lPowerOfTwo) 
{ 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 

    glGenerateMipmap(GL_TEXTURE_2D); 
}else 
{ 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 

    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
} 

CGContextRelease(context); 

free(imageData); 

Die lTextId Variable hat die opengl Textur ID.

Hinweis: Wenn die Textur Dimension nicht Potenz von zwei ist, wird die Textur gezeigt schwarz werden, wenn die GL_TEXTURE_WRAP_S und _T nicht

0

GL_GLAMP_TO_EDGE gesetzt hatte ich fast den gleichen Fehler:

Error Domain=GLKTextureLoaderErrorDomain Code=8 "(null)" UserInfo={GLKTextureLoaderGLErrorKey=1282, GLKTextureLoaderErrorKey=OpenGLES Error.}

Es wird verursacht, indem man zwischen Programmen umschaltet. Wenn ich versuche, glUniform1i mit einem Programm aufzurufen, das derzeit nicht verwendet wird, wird ein Open GL ES-Fehlerhaltepunkt auftreten.

Korrigiert durch Verwendung des richtigen Programms, triggert jeden Fehlerhaltepunkt.

Verwandte Themen