首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >格式错误的OpenGL纹理调用CGBitmapContextCreateImage后

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

Stack Overflow用户
提问于 2013-06-04 14:56:25
回答 2查看 246关注 0票数 1

我试图使用UIView的内容作为OpenGL纹理。我是如何获得它的:

代码语言:javascript
复制
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循环),下面是结果:

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-06-05 11:58:01

解决问题:上面的图片是当您应用与表面相同的纹理,但交换曲面的st坐标时得到的。尽管如此,彩色组件仍然是需要的。

票数 0
EN

Stack Overflow用户

发布于 2013-06-04 15:05:24

看起来像是对齐问题。我建议把

代码语言:javascript
复制
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

在此之前

代码语言:javascript
复制
return [GLKTextureLoader textureWithCGImage:image options:nil error:nil];

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16921059

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档