我正在尝试将 UIView 的内容用作 OpenGL 纹理。这是我获得它的方式:
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
char *rawImage = malloc(4 * s.width * s.height);
CGContextRef bitmapContext = CGBitmapContextCreate(rawImage,
s.width,
s.height,
8,
4 * s.width,
colorSpace,
kCGImageAlphaNoneSkipFirst);
[v.layer renderInContext:bitmapContext];
// converting ARGB to BGRA
for (int i = 0; i < s.width * s.height; i++) {
int p = i * 4;
char a = rawImage[p];
char r = rawImage[p + 1];
char g = rawImage[p + 2];
char b = rawImage[p + 3];
rawImage[p] = b;
rawImage[p + 1] = g;
rawImage[p + 2] = r;
rawImage[p + 3] = a;
}
CFRelease(colorSpace);
CGImageRef image = CGBitmapContextCreateImage(bitmapContext);
return [GLKTextureLoader textureWithCGImage:image options:nil error:nil];
这是我开始使用的 UIView(注意左上角的小三角形):
这是我在拍摄快照后在 OpenGL 表面上得到的:
很明显,坐标被破坏了,但我不知道以哪种方式以及我做错了什么。是行字节对齐出错了吗?
更新:如果我不进行颜色组件混合(省略 ARGB 到 BGRA 循环),这是结果图片: