gpt4 book ai didi

iphone - 使用 CGBitmapContextCreate 创建的图像作为 opengl 纹理

转载 作者:行者123 更新时间:2023-12-03 18:30:58 25 4
gpt4 key购买 nike

我正在使用 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.

如文档 here 中所述,这是 CGBitmapContextCreate 唯一支持的 RGB 像素格式,每像素使用 16 位。所以现在我想将这个看起来像“1 位跳过 - 5 位红色 - 5 位绿色 - 5 位蓝色”的 imageData 上传到 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 等手动交换字节,因为这看起来效率非常低。

最佳答案

您确实需要交换位以将其转换为更密集的格式,例如 RGBA551 或 RGB565,因为正如您所注意到的,CGBitmapContext 不支持这些绘图格式(为了简单和高效)。

memset 无法解决问题,但 Accelerate.framework 中有“快速”转换例程。

请参阅 vImageConvert_ARGB8888toRGB565(...)vImageConvert_ARGB8888toARGB1555(...),适用于 iOS 5 及更高版本。

关于iphone - 使用 CGBitmapContextCreate 创建的图像作为 opengl 纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3386650/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com