用于JPEG的iPhone OpenGL ES纹理流水线

时间:2011-05-16 19:01:44

标签: iphone opengl-es texture2d

我无法让我的纹理管道适用于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上节省空间。

1 个答案:

答案 0 :(得分:1)

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