6

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

这在上次升级之前有效。也许我在时机上很幸运。我怀疑它失败是因为某个线程很忙还是什么?

这是完整的错误。

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

所以问题是,我可以安全地从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

4 回答 4

1

我遇到了这样的问题,工作是在没有 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 纹理 ID。

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

于 2013-09-10T17:18:35.497 回答
0

我看到了同样的行为,这是由不相关的错误引起的。修复错误,纹理应该正确加载。看到这个帖子:GLKTextureLoader第一次加载某个纹理时失败,但第二次成功

于 2013-04-07T05:52:25.947 回答
0

我和你有类似的问题。我为解决这个问题所做的就是创建一个包含我想在整个游戏中使用的所有纹理的类。在viewDidLoad:我初始化了类并加载了所有的纹理。当我需要使用任何纹理时,它们已经被加载并且没有出现问题。

例如。在viewDidLoad

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

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

然后当你需要使用纹理时

[myBackground setTexture: textures.backgroundTexture2];

希望这有帮助:)

于 2012-07-12T05:30:39.813 回答
0

我有几乎相同的错误:

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

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

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

于 2018-01-25T07:55:02.033 回答