我正在尝试将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循环),这是结果图:
答案 0 :(得分:0)
看起来像对齐问题。我建议加一个
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
前
return [GLKTextureLoader textureWithCGImage:image options:nil error:nil];
此外,在进行该组件调配时,您可能会搞乱对齐,因为现代OpenGL直接支持BGRA格式,因此BTW是完全不必要的。
答案 1 :(得分:0)
解决:上面的图片是您应用与表面具有相同比率的纹理时所获得的图片,但交换表面的s
和t
坐标。但是,仍然需要色彩组件的混合。