1

我正在尝试将 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 表面上得到的:

OpenGL 表面

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

更新:如果我不进行颜色组件混合(省略 ARGB 到 BGRA 循环),这是结果图片:

OpenGL表面,没有颜色成分混杂

4

2 回答 2

0

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

glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

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

此外,在进行组件调配时,您可能会弄乱对齐方式,顺便说一句,这是完全不必要的,因为现代 OpenGL 直接支持 BGRA 格式。

于 2013-06-04T15:05:24.590 回答
0

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

于 2013-06-05T11:58:01.710 回答