2014-02-04 3 views
0

Im пытаясь установить определенную текстуру на объект, openGL ES это, как я загрузить его:Загрузка файла PNG в OpenGL ES

- (GLuint)setupTexture:(NSString *)fileName { 
    // 1 
    CGImageRef spriteImage = [UIImage imageNamed:fileName].CGImage; 
    if (!spriteImage) { 
     NSLog(@"Failed to load image %@", fileName); 
     exit(1); 
    } 

    size_t width = CGImageGetWidth(spriteImage); 
    size_t height = CGImageGetHeight(spriteImage); 


    GLubyte * spriteData = (GLubyte *) calloc(width*height*4, sizeof(GLubyte)); 


    CGContextRef spriteContext = CGBitmapContextCreate(spriteData, width, height, 8, width*4, 
                 CGImageGetColorSpace(spriteImage), kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); 

    CGContextDrawImage(spriteContext, CGRectMake(0, 0, width, height), spriteImage); 

    CGContextRelease(spriteContext); 
... 
} 

Теперь, когда я использую этот tile_floor.png файл:

enter image description here

изображение загружается и рисуется на экране.

но когда я использую этот wood.png файл:

enter image description here

все это я получаю черный объект.

Почему это другое? есть ли какое-либо значение для размеров файла (ширина или высота)? я не «жестко кодировал» любые измерения или параметры, чтобы можно было загружать все изображения.

Важно сказать, что я не получаю никаких ошибок в консоли, и программа работает.

ответ

0

В то время как вы можете использовать NPOT (не-мощь два) изображений во многих реализациях OpenGL ES (все IOS устройство поддерживает расширение GL_APPLE_texture_2D_limited_npot) вы должны использовать режим правого края:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 

Это сделает текстурный зажим к краям координаты текстуры 0, 1. Текстура дерева выглядит так, как будто она не повторяется.

+0

Спасибо за ответ nikolai, я попытался изменить код на ваше предложение, но я снова получаю черный объект. любая идея почему? – Itzik984

+0

@ Itzik984 Вы используете какой-нибудь смешной mipmap-фильтр (кроме ближайшего или линейного)? –

+0

Nikolai, не используется фильтр mipmap ... – Itzik984

0

ОК, я получил это. Для openGL ES требуется 2 размера изображения (ширина и высота). Изменен размер фотографии, и это сработало.

+0

Это должен был быть комментарий, а не новый ответ. – rckoenes

Смежные вопросы