2012-01-12 2 views
0

Я делаю снимок через камеру, и я хочу изменить его формат, чтобы сделать его совместимым с OpenGL ES 2.0.Как изменить формат изображения в ios для использования в OpenGL? (Загрузить изображения в OpenGL ES 2.0)

Сначала я получить картину, и я изменить его размер (что делает его силу 2 на всякий случай):

UIImage *newImage = [self imageWithImage:imgName scaledToSize:CGSizeMake(100, 144)]; 

Затем изменить формат из формата JPEG (который я думаю, его формат на iPhone по умолчанию), чтобы PNG:

NSData *test = UIImagePNGRepresentation(newImage); 

UIImage *converted = [[UIImage alloc] initWithData:test]; 

Последнее, что я создаю свой контекст и вовлечь в него:

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

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



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

CGContextRelease(spriteContext); 

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

Я сделал некоторые исследования, и это может быть связано с глубиной цвета в моем изображении, так как мне нужно 4 бита на пиксель для рендеринга в opengl texture (4,4,4,4).

Внутренний формат: RGBA, Внешний Формат: RGBA, Тип: UNSIGNED BYTE, байт на пиксель: 4.

Так что мой вопрос, как я могу изменить этот формат PNG с любой глубины имеет к схеме мне нужно ?

PD: Если кто-то знает другой способ загрузить изображение в opengl, пожалуйста, дайте мне знать!

Спасибо!

ответ

0

мой метод настройки текстуры. Я думаю, что все понятно, если нет - задайте вопросы

- (GLuint)setupTexture:(NSString *)fileName { 
    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);  

    CGContextTranslateCTM (spriteContext, 0, height); 
    CGContextScaleCTM (spriteContext, 1.0, -1.0); 

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

    CGContextRelease(spriteContext); 

    GLuint texName; 
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); 
    glGenTextures(1, &texName); 
    glBindTexture(GL_TEXTURE_2D, texName); 


    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 


    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, spriteData); 

    free(spriteData);   
    return texName; 
} 
+0

Благодарим за быстрый ответ. Я попробовал ваш метод, и он работает только для уже определенной текстуры. проблема в том, что я пытаюсь «текстурировать» объект, используя камеру на iphone, поэтому мне нужно взять вход с камеры. У меня есть изображение, и я показываю его на своем экране в форматах jpeg и png, поэтому я знаю, что он работает, я также попытался изменить его размер. но когда я попытался отобразить его, используя свой метод, я получаю тот же результат im im (черный, где текстура должна быть). Я столкнулся с чем-то подобным, когда захотел создать свою текстуру, и проблема была в глубине цвета. Есть идеи? = ( – Pochi

+0

Оказалось, что проблема была в размере размера, который я создавал. Эта строка UIImage * newImage = [self imageWithImage: imgName scaledToSize: CGSizeMake (100, 144)]; Создает NON мощность 2 изображения и для текстур iphone вам нужно иметь 2 изображения (256x256, 256x512 и т. д.) Thx для ур помочь – Pochi

+0

да! :) Я думаю, вы знаете об этом. – SAKrisT

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