从更新调用时,GLKTextureLoader失败

时间:2012-05-19 02:20:23

标签: ios xcode opengl-es

从viewDidLoad加载纹理工作正常。但是,如果我尝试从GLKViewController更新中加载它们,我会收到错误消息。我这样做是因为我想在不改变视图的情况下交换新的背景纹理。

这在上次升级之前有效。也许我对时间很幸运。我怀疑它是失败的,因为某些线程正忙或什么?

这是完整的错误。

Domain = GLKTextureLoaderErrorDomain Code = 8“无法完成操作。(GLKTextureLoaderErrorDomain error 8.)”UserInfo = 0x10b5b510 {GLKTextureLoaderGLErrorKey = 1282,GLKTextureLoaderErrorKey = OpenGL error}

所以问题是,我可以安全地从GLKViewController更新功能加载纹理吗?或者我是否需要重新考虑我的方法并重新加载整个视图或什么?

这是我的功能:

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

谢谢,

大卫

4 个答案:

答案 0 :(得分:1)

我遇到了这样的问题,并且工作arround正在加载没有glktextureloader的纹理。

这里有一些代码用于在没有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);

lTextId变量具有opengl纹理标识。

注意:如果纹理尺寸不是2的幂,如果GL_TEXTURE_WRAP_S和_T未设置为GL_GLAMP_TO_EDGE,纹理将显示为黑色

答案 1 :(得分:0)

我遇到了类似的问题。我解决这个问题的方法是让一个拥有我想要用于整个游戏的所有纹理的Class。在viewDidLoad:中,我初始化了类并加载了所有纹理。当我需要使用任何纹理时,它们已经加载并且没有出现问题。

例如。在viewDidLoad

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

LoadAll将加载所有纹理以供以后使用

然后当你需要使用纹理时

[myBackground setTexture: textures.backgroundTexture2];

希望这有助于:)

答案 2 :(得分:0)

我看到了同样的行为,这是由无关的错误引起的。修复错误,纹理应正确加载。请参阅此主题:GLKTextureLoader fails when loading a certain texture the first time, but succeeds the second time

答案 3 :(得分:0)

我有几乎相同的错误:

  

错误域= GLKTextureLoaderErrorDomain代码= 8"(null)" UserInfo = {GLKTextureLoaderGLErrorKey = 1282,GLKTextureLoaderErrorKey = OpenGLES Error。}

这是由程序之间的切换引起的。如果我尝试使用当前未使用的程序调用glUniform1i,将会遇到Open GL ES错误断点。

使用正确的程序修复,避免触发任何错误断点。