【问题标题】:Malformed OpenGL texture after calling CGBitmapContextCreateImage调用 CGBitmapContextCreateImage 后出现格式错误的 OpenGL 纹理
【发布时间】:2023-04-03 06:40:01
【问题描述】:

我正在尝试将 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 循环),这是生成的图片:

【问题讨论】:

    标签: iphone ios opengl-es


    【解决方案1】:

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

    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
    

    之前

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

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

    【讨论】:

    • 没有帮助。 glPixelStorei(GL_UNPACK_ALIGNMENT, 1);glPixelStorei(GL_UNPACK_ALIGNMENT, 4); 都生成同一张图片
    • @SergeyMikhanov:查看我编辑的答案。这绝对是对齐问题,而不是坐标问题。
    • 我完全删除了 swizzling,请参阅问题所附的新图片。请注意,在这两种情况下,X 和 Y 坐标都是交换的(您可以在按钮标签中看到它)——我认为错位不会导致这种情况
    • @SergeyMikhanov:这种偏差绝对是一个错位问题。 OpenGL 也假定左下角的像素原点。在您发布绘图例程的源代码之前,任何与纹理坐标有关的问题都很难解决。
    【解决方案2】:

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

    【讨论】:

    • 您可以在这里发布工作代码,以便其他人可以从您的经验中受益吗?
    猜你喜欢
    • 2016-01-11
    • 1970-01-01
    • 1970-01-01
    • 2015-09-28
    • 1970-01-01
    • 1970-01-01
    • 2018-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多