Я разрабатываю приложение для iPhone OpenGL, и мне нужно использовать некоторые текстуры с прозрачностью. Я сохранил изображения в формате PNG. У меня уже есть весь код для загрузки PNG как текстур OpenGL и их рендеринга. Это работает нормально для всех изображений, которые не имеют прозрачности (все альфа-значения равны 1,0). Однако теперь, когда я пытаюсь загрузить и использовать некоторые PNG-файлы, которые имеют прозрачность (варьирующие альфа-значения), моя текстура испорчена, как будто она загружает данные неправильно или что-то в этом роде.
Я почти уверен, что это связано с загрузкой кода, который использует некоторые API-интерфейсы Cocoa. Я выложу здесь соответствующий код.
Каков наилучший способ загрузки PNG или любого формата изображения, поддерживающего прозрачность, на OSX / iPhone? Этот метод чувствует себя окольным. Визуализация его в CGContext и получение данных кажется странным.
* ЗАГРУЗКА *
CGImageRef CGImageRef_load(const char *filename) {
NSString *path = [NSString stringWithFormat:@"%@/%s",
[[NSBundle mainBundle] resourcePath],
filename];
UIImage *img = [UIImage imageWithContentsOfFile:path];
if(img) return [img CGImage];
return NULL;
}
unsigned char* CGImageRef_data(CGImageRef image) {
NSInteger width = CGImageGetWidth(image);
NSInteger height = CGImageGetHeight(image);
unsigned char *data = (unsigned char*)malloc(width*height*4);
CGContextRef context = CGBitmapContextCreate(data,
width, height,
8, width * 4,
CGImageGetColorSpace(image),
kCGImageAlphaPremultipliedLast);
CGContextDrawImage(context,
CGRectMake(0.0, 0.0, (float)width, (float)height),
image);
CGContextRelease(context);
return data;
}
* ЗАГРУЗКА *
(define (image-opengl-upload data width height)
(let ((tex (alloc-opengl-image)))
(glBindTexture GL_TEXTURE_2D tex)
(glTexEnvi GL_TEXTURE_ENV GL_TEXTURE_ENV_MODE GL_DECAL)
(glTexImage2D GL_TEXTURE_2D
0
GL_RGBA
width
height
0
GL_RGBA
GL_UNSIGNED_BYTE
(->void-array data))
(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_WRAP_S
GL_CLAMP_TO_EDGE)
(glTexParameteri GL_TEXTURE_2D
GL_TEXTURE_WRAP_T
GL_CLAMP_TO_EDGE)
(glBindTexture GL_TEXTURE_2D 0)
tex))