Как преобразовать формат QImage в формат, поддерживаемый OpenGL - PullRequest
4 голосов
/ 16 июля 2011

Я использую QImage для загрузки изображений, которые затем используются в качестве текстур в OpenGL. Проблема в том, что компоненты цвета имеют разный порядок в QImage и OpenGL. В настоящее время я использую формат GL_RGBA в OpenGL и QImage::Format_ARGB32 в Qt. Из-за этого я должен вручную поменять местами байты для каждого пикселя загруженного изображения перед созданием текстуры в OpenGL. Более того, чтобы правильно поменять местами байты, мне нужно знать порядковый номер машины.

Кто-нибудь знает лучшее решение для этого? По крайней мере, есть ли способ сделать это преобразование независимым от порядка байтов?

Спасибо.

1 Ответ

5 голосов
/ 17 июля 2011

Последние три параметра glTex(Sub)Image определяют, как происходит передача пикселя в OpenGL .Если у вас есть 4 8-битных значения, последовательно, в порядке ARGB, то я бы предложил следующее:

glTexImage2D(..., GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, *);

Для решения проблем преобразования с порядком байтов используйте параметры glPixelStore.В частности, GL_UNPACK_SWAP_BYTES.Вышеуказанное предназначено для машин с прямым порядком байтов, поэтому, если вы работаете с машиной с прямым порядком байтов, вам следует вызвать glPixelStorei(GL_UNPACK_SWAP_BYTES, GL_TRUE); перед вызовом этой функции, а затем установить обратно значение GL_FALSE.


Примечание: я знаю, что вы не упомянули об этом, но если вы рассматриваете мобильные платформы, помните, что OpenGL ES - это , а не OpenGL.Для OpenGL рабочего стола требуются реализации, чтобы иметь возможность обрабатывать самые разнообразные варианты расположения пикселей в операциях передачи.GL ES обязывает почти наоборот.Форматы передачи пикселей должны точно соответствовать внутреннему формату текстуры.Поэтому, если бы вы занимались разработкой GL ES, вам пришлось бы делать замену байтов самостоятельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...