Как изменить формат изображения в ios для использования в OpenGL?(Загрузить изображения в OpenGL ES 2.0) - PullRequest
0 голосов
/ 12 января 2012

Я делаю снимок через камеру и хочу изменить его формат, чтобы сделать его совместимым с текстурой 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, к сожалению, он не работает (появляется только черный), я уверен, что это из-за формата изображения, потому что если я делаю ту же самую процедуру с другим изображением, которое я уже знаю это работает, тогда все идет гладко.

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

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

Итак, мой вопрос: как мне изменить этот png с любой необходимой ему глубины на схему, которая мне нужна?

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

Спасибо!

1 Ответ

0 голосов
/ 12 января 2012

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

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