2012-05-19 35 views
6

Tải họa tiết từ viewDidLoad hoạt động tốt. Nhưng nếu tôi cố tải chúng từ bản cập nhật GLKViewController tôi gặp lỗi. Tôi làm điều này bởi vì tôi muốn trao đổi trong một kết cấu nền mới mà không thay đổi quan điểm.GLKTextureLoader không thành công khi gọi từ bản cập nhật

Điều này đang hoạt động trước khi nâng cấp lần cuối. Có lẽ tôi đã may mắn với thời gian. Tôi nghi ngờ rằng nó không thành công vì một số chủ đề bận hay gì đó?

Đây là lỗi đầy đủ.

miền = GLKTextureLoaderErrorDomain Mã = 8 "Các hoạt động không thể hoàn tất. (GLKTextureLoaderErrorDomain lỗi 8.)" UserInfo = 0x10b5b510 {GLKTextureLoaderGLErrorKey = 1282, GLKTextureLoaderErrorKey = OpenGL error}

Vì vậy, câu hỏi là, thế nào tôi có thể tải một kết cấu an toàn từ chức năng cập nhật GLKViewController? Hay tôi cần phải suy nghĩ lại cách tiếp cận của mình và tải lại toàn bộ khung nhìn hay gì đó?

Đây là chức năng của tôi:

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

Cảm ơn,

David

+0

Tôi gặp vấn đề tương tự ở đây. Bạn đã tìm thấy một giải pháp? – hanno

+0

Tôi chưa điều tra. Dường như cuộc gọi đồng bộ này có thể thất bại nếu một số tài nguyên bận. Tôi tưởng tượng giải pháp là tải là không đồng bộ bằng cách sử dụng phiên bản dài hơn của chức năng này, nơi bạn vượt qua trong một trình xử lý hoàn thành. Phiên bản trì hoãn này có nghĩa là bạn sẽ nhận được kết cấu vào một thời điểm sau đó để cần được xử lý đúng cách, nhưng tôi hy vọng đây sẽ là giải pháp. - textureWithContentsOfFile: options: queue: completionHandler: –

+1

Tôi đã từ bỏ cuối cùng và chỉ sử dụng glTexImage2D cũ đơn giản. – hanno

Trả lời

0

Tôi đã có một vấn đề tương tự như bạn. Những gì tôi đã làm để khắc phục vấn đề là có một lớp học có tất cả các kết cấu tôi muốn sử dụng cho toàn bộ trò chơi. Trong viewDidLoad: Tôi đã khởi tạo lớp và tải tất cả các họa tiết. Khi tôi cần sử dụng bất kỳ kết cấu nào, chúng đã được tải và vấn đề không xảy ra.

ví dụ: Trong viewDidLoad

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

LoadAll sẽ tải tất cả các kết cấu cho sau này sử dụng

Sau đó, khi bạn cần phải sử dụng một kết cấu

[myBackground setTexture: textures.backgroundTexture2]; 

Hy vọng điều này giúp :)

1

Tôi gặp vấn đề như thế này và arround công việc đang tải kết cấu mà không có glktextureloader.

Dưới đây một số mã cho tải kết cấu mà không 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); 

Biến lTextId có Id OpenGL Texture.

Lưu ý: nếu kích thước kết cấu không phải là sức mạnh của hai, kết cấu sẽ được hiển thị màu đen nếu GL_TEXTURE_WRAP_S và _T không được thiết lập để GL_GLAMP_TO_EDGE

0

tôi đã gần như lỗi tương tự:

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

Nó là do chuyển đổi giữa các chương trình. Một điểm ngắt lỗi Open GL ES sẽ gặp phải nếu tôi cố gắng gọi glUniform1i với một chương trình hiện không được sử dụng.

Cố định bằng cách sử dụng chương trình chính xác, tránh kích hoạt bất kỳ điểm ngắt lỗi nào.

Các vấn đề liên quan