调用CGBitmapContextCreateImage后格式错误的OpenGL纹理

时间:2013-06-04 14:56:25

标签: iphone ios opengl-es

我正在尝试将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(注意左上角的小三角形):

UIView

这是拍摄快照后我在OpenGL表面上得到的结果:

OpenGL surface

很明显,坐标被破坏但我无法分辨出哪种方式以及我做错了什么。这是行字节对齐出错吗?

更新:如果我不做色彩组件调整(省略ARGB到BGRA循环),这是结果图:

OpenGL surface, no color components swizzling

2 个答案:

答案 0 :(得分:0)

看起来像对齐问题。我建议加一个

glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

return [GLKTextureLoader textureWithCGImage:image options:nil error:nil];

此外,在进行该组件调配时,您可能会搞乱对齐,因为现代OpenGL直接支持BGRA格式,因此BTW是完全不必要的。

答案 1 :(得分:0)

解决:上面的图片是您应用与表面具有相同比率的纹理时所获得的图片,但交换表面的st坐标。但是,仍然需要色彩组件的混合。