我试图使用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表面得到的信息:

很明显,坐标被弄坏了,但我不知道我是怎么做的,做错了什么。是行字节对齐出错了吗?
UPDATE:如果我不执行颜色组件切换(忽略ARGB到BGRA循环),下面是结果:

发布于 2013-06-05 11:58:01
解决问题:上面的图片是当您应用与表面相同的纹理,但交换曲面的s和t坐标时得到的。尽管如此,彩色组件仍然是需要的。
发布于 2013-06-04 15:05:24
看起来像是对齐问题。我建议把
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);在此之前
return [GLKTextureLoader textureWithCGImage:image options:nil error:nil];此外,您可能会在执行该组件swizzling时搞砸对齐,这是BTW完全不必要的,因为现代OpenGL直接支持BGRA格式。
https://stackoverflow.com/questions/16921059
复制相似问题