【问题标题】:iPhone OpenGL ES Texture Pipeline for JPEG用于 JPEG 的 iPhone OpenGL ES 纹理管道
【发布时间】:2011-08-26 16:39:57
【问题描述】:

我的纹理管道无法用于 JPEG。一切都适用于 PNG,但转换一直是个问题。

我通过 UIImage 和 CGBitmapContextCreate 加载图像数据

UIImage* tI = [UIImage imageWithContentsOfFile:fileName];
Image = tI.CGImage;

mWidth = CGImageGetWidth(Image);
mHeight = CGImageGetHeight(Image);

mData = new uint8[mWidth * mHeight * 4];

Context = CGBitmapContextCreate(mData, mWidth, mHeight, CGImageGetBitsPerComponent(Image), CGImageGetBytesPerRow(Image), 
                                CGImageGetColorSpace(Image), 
                                CGImageGetBitmapInfo(Image));

CGContextDrawImage(Context, CGRectMake(0.0, 0.0, float(mWidth), float(mHeight)), Image);
CGContextRelease(Context);

然后我通过调用设置我的 GLTexture...

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, texture->Width(), texture->Height(), 0, GL_RGB, GL_UNSIGNED_BYTE, texture->Data());

我怀疑这个 glTexImage2D 调用是问题所在。我一直在使用不同的组合来尝试让事情发挥作用。 alpha 的 BitmapInfo 状态是“kCGImageAlphaNoneSkipLast”,所以我不确定我是否应该使用 RGBA 和 GL_UNSIGNED_SHORT_5_5_5_1,但到目前为止我没有尝试过任何组合。我得到的最接近的是......

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texture->Width(), texture->Height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, texture->Data());

这给了我非常夸张的纹理(颜色边缘可辨别,但一切都太亮了)

任何帮助都会很棒。我正在使用 JPEG 来尝试通过 PNG 节省空间。

【问题讨论】:

    标签: iphone opengl-es texture2d


    【解决方案1】:

    您的 mData 缓冲区太大。 JPEG 图像不支持 alpha,因此每个像素 (RGB) 只有三个分量,而对于 PNG (RGBA) 通常使用四个分量。

    【讨论】:

    • 不应该忽略最后的额外缓冲空间吗?我将每个组件的宽度、高度和大小传递给 GL。它计算出缓冲区的大小,所以它不应该关心内存中超出这些点的内容?
    猜你喜欢
    • 1970-01-01
    • 2012-01-12
    • 2011-11-16
    • 1970-01-01
    • 1970-01-01
    • 2011-11-08
    • 2012-07-07
    • 2011-05-19
    • 1970-01-01
    相关资源
    最近更新 更多