Я пишу приложение для Mac OS> = 10.6, которое создает текстуры OpenGL из изображений, загруженных с диска.
Сначала я загружаю изображение в NSImage.Затем я получаю NSBitmapImageRep из изображения и загружаю данные пикселей в текстуру, используя glTexImage2D.
Для изображений RGB или RGBA, он работает отлично.Я могу передать либо 3 байта / пиксель RGB, либо 4 байта RGBA и создать 4-байтовую / пиксельную RGBA-текстуру.
Однако мне только что тестер отправил мне изображение JPEG (снято наCanon EOS 50D, не уверен, как он был импортирован), который, кажется, имеет порядок следования байтов ARGB.
Я нашел сообщение в этой теме: (http://www.cocoabuilder.com/archive/cocoa/12782-coregraphics-over-opengl.html) Это предполагает, что я указываю параметр формата GL_BGRA для glTexImage2Dи тип GL_UNSIGNED_INT_8_8_8_8_REV.
Это кажется логичным и кажется, что оно должно работать, но это не так. Я получаю разные, но все же неправильные, значения цвета.
Я написал "swizzling "(ручной байт-обмен) код, который перетасовывает данные изображений ARGB в новый буфер RGBA, но этот побайтовый переход будет медленным для больших изображений.
Я также хотел бы понятькак сделать так, чтобы это работало «правильно».
В чем заключается хитрость загрузки данных ARGB в текстуру RGBA OpenGL?
Мой текущий вызов xxx выглядит следующим образом:
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, newWidth, newHeight, 0, format, GL_UNSIGNED_BYTE, pixelBuffer);
где либо RGBили RGBA.
Я пытался использовать:
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, newWidth, newHeight, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, pixelBuffer);
Когда мой репортер сообщает, что он в "альфа-первом" порядке.
В качестве второго вопроса яТакже мы читаем, что «родной» формат большинства видеокарт - GL_BGRA, поэтому создание текстуры в этом формате приводит к более быстрому рисованию текстуры.Скорость рисования текстур важнее, чем скорость загрузки текстур, поэтому «перебор» данных в формате BGRA заранее стоил бы того.Я попытался попросить OpenGL создать текстуру BGRA, указав «внутренний формат» GL_RGBA, но в результате получилось полностью черное изображение.Моя интерпретация документов заставляет меня ожидать, что glTexImage2D будет байт-своп данных, когда он читает их, если исходный и внутренний форматы отличаются, но вместо этого я получаю ошибку OpenGL 0x500 (GL_INVALID_ENUM), когда я пытаюсь указать «internalformat»GL_RGBA.Чего мне не хватает?