Текстурный конвейер iPhone OpenGL ES для JPEG - PullRequest
0 голосов
/ 16 мая 2011

У меня проблемы с тем, чтобы мой конвейер текстур работал на 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 является проблемой. Я использовал разные комбинации, чтобы попытаться заставить вещи работать. Состояние 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 Ответ

1 голос
/ 16 мая 2011

Ваш буфер mData слишком велик. Изображения JPEG не поддерживают альфа-канал, поэтому на пиксель (RGB) приходится всего три компонента, тогда как для PNG (RGBA) обычно используется четыре.

...