0

我无法让我的纹理管道为 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 的空间。

4

1 回答 1

1

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

于 2011-05-16T19:13:54.960 回答