Я генерирую изображение, используя quartz2d
, и я хочу использовать его в качестве opengl
текстуры.Сложность в том, что я хочу использовать как можно меньше бит на пиксель, поэтому я создаю cgContext
следующим образом:
int bitsPerComponent = 5;
int bytesPerPixel = 2;
int width = 1024;
int height = 1024;
void* imageData = malloc(width * height * bytesPerPixel);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGImageContext context = CGBitmapContextCreate(imageData, width, height, bitsPerComponent, width * bytesPerPixel, colorSpace, kCGImageAlphaNoneSkipFirst);
//draw things into context, release memory, etc.
Как указано в документации здесь ,это единственный поддерживаемый формат RGB
пикселей для CGBitmapContextCreate
, который использует 16 бит на пиксель.Итак, теперь я хочу загрузить данные imageData, которые выглядят как «1 бит пропущен - 5 бит красного цвета - 5 бит зеленого цвета - 5 бит синего» в текстуру opengl.Поэтому я должен сделать что-то вроде этого:
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1, imageData);
Это не сработает, потому что в этом вызове я указал пиксельный формат как 5 red - 5 green - 5 blue - 1 alpha
.Это неправильно, но похоже, что нет формата, который соответствовал бы основному графическому выводу.
Есть некоторые другие опции, такие как GL_UNSIGNED_SHORT_1_5_5_5_REV
, но они не будут работать на iphone
.
Мне нужнокакой-то способ использовать это imageData
в качестве текстуры, но я действительно не хочу обменивать байты вручную, используя memset или тому подобное, потому что это кажется ужасно неэффективным.