2011-05-16 41 views
0

我無法讓我的紋理流水線工作於JPEG。一切適用於PNG,但轉換一直是個問題。用於JPEG的iPhone OpenGL ES紋理流水線

我對圖像數據通過的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

您的mData緩衝區太大。 JPEG圖像不支持alpha,所以每像素(RGB)只有三個分量,而通常使用四個PNG(RGBA)。

+0

最後的額外緩衝區空間不應該被忽略嗎?我將GL的寬度,高度和尺寸傳遞給每個組件,它會計算出緩衝區的大小,所以它不應該在乎內存中的那些點以外的內容? – TurqMage 2011-05-16 19:26:20

+0

你可能是對的。 – omz 2011-05-16 19:46:08