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

标签 iphone opengl-es core-graphics

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

相关文章:

android - MediaCodecMuxer 编码视频太慢

ios - 非圆形发光的 CGContextDrawRadialGradient

ios - 在 Swift 中调整 CAShapeLayer 的大小

iphone - 为什么要删除 subview ?

iOS 7 应用程序不会填满 Xcode 6 模拟器中的整个屏幕

iphone - Apple 使用哪个硬件芯片/供应商进行硬件加速 AES/SHA-1 加密?

android - Android OpenGL ES 中的灰度颜色深度

ios - 如何在 opengl es 中使用由 UIGraphicsBeginImageContextWithOptions() 制作的图像

iphone - 为 iOS4.3 和 iOS5.0 构建问题

ios - 随机生成的CGGradient不会显示