2012-05-19 22 views
6

Cargando texturas desde viewDidLoad funciona bien. Pero si intento cargarlos desde la actualización GLKViewController, aparece un error. Lo hago porque quiero cambiar una nueva textura de fondo sin cambiar la vista.GLKTextureLoader falla al llamar desde la actualización

Esto estaba funcionando antes de la última actualización. Tal vez estaba teniendo suerte con los tiempos. Sospecho que está fallando porque algún hilo está ocupado o algo así?

Aquí está el error completo.

Dominio = Código GLKTextureLoaderErrorDomain = 8 "La operación no se pudo completar. (GLKTextureLoaderErrorDomain error 8.)" UserInfo = {0x10b5b510 GLKTextureLoaderGLErrorKey = 1282, GLKTextureLoaderErrorKey = Error de OpenGL}

Así que la pregunta es, ¿Puedo cargar con seguridad una textura desde la función de actualización GLKViewController? ¿O necesito volver a pensar mi enfoque y volver a cargar toda la vista o algo así?

Aquí es mi función:

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

Gracias,

David

+0

Tengo el mismo problema aquí. ¿Encontraste una solución? – hanno

+0

No, no he investigado aún. Parece que esta llamada síncrona puede fallar si algún recurso está ocupado. Imagino que la solución es cargar de forma asincrónica utilizando la versión más larga de esta función donde pasa un controlador de finalización. Esta versión diferida significa que obtendrá la textura en un momento posterior, por lo que debe manejarse adecuadamente, pero espero que esta sea la solución. - textureWithContentsOfFile: options: queue: completionHandler: –

+1

Me rendí al final y simplemente uso el viejo y simple glTexImage2D. – hanno

Respuesta

0

tuve un problema similar en su caso. Lo que hice para solucionar el problema fue tener una clase que tuviera todas las texturas que quería usar para todo el juego. En viewDidLoad:, inicié la clase y cargué todas las texturas. Cuando necesité usar alguna de las texturas, ya estaban cargadas y el problema no ocurrió.

por ejemplo. En viewDidLoad

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

loadall sería cargar todas las texturas para su uso posterior

Luego, cuando es necesario utilizar una textura

[myBackground setTexture: textures.backgroundTexture2]; 

Espero que esto ayudó :)

1

Tuve un problema como este y el trabajo fue cargar la textura sin el glktextureloader.

Aquí algo de código para cargar la textura sin la 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); 

La variable lTextId tiene el Id textura de OpenGL.

Nota: si la dimensión textura no es potencia de dos, la textura se mostrará negro si el GL_TEXTURE_WRAP_S y _T no se establecen en GL_GLAMP_TO_EDGE

0

que tenía casi el mismo error:

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

Es causado al cambiar de programa. Se encontrará un punto de interrupción de error Open GL ES si intento llamar a glUniform1i con un programa que no está actualmente en uso.

Solucionado mediante el uso del programa correcto, evite desencadenar cualquier punto de interrupción de error.

Cuestiones relacionadas