У меня есть этот файл DDS. Я написал простую программу чтения DDS для чтения заголовка DDS и вывода сведений о нем на основе спецификации MSDN. В нем говорится, что это RGB DDS с битовой глубиной 32 байта на пиксель, а альфа игнорируется, т. Е. Формат пикселя - X8R8G8B8 (или A8R8G8B8). Чтобы убедиться в этом, я также открыл этот файл в шестнадцатеричном редакторе, который показывает первые (т.е. от начала данных) 4 байта как BB GG RR 00
(замените их правыми шестнадцатеричными значениями цвета первого пикселя). Я читал, что копия текстуры OpenGL функции воздействуют на байты (по крайней мере, концептуально) и, таким образом, с их точки зрения, эти данные являются B8G8R8A8. Пожалуйста, поправьте меня, если мое понимание здесь неверно.
Теперь к glTexImage2D
внутреннему формату я передаю RGBA8
, а к внешнему формату и типу я передаю BGRA
и UNSIGNED_BYTE
. Это приводит к синему оттенку в визуализируемом выводе. В моем фрагментном шейдере, просто для проверки, я сделал swizzle, чтобы поменять местами R
и B
, и он отображается правильно.
Я изменил код шейдера, а затем заменил type с UNSIGNED_BYTE
на UNSIGNED_INT_8_8_8_8_REV
(на основе этого предложения ), и он по-прежнему отображает синий оттенок. Теперь изменив внешний формат на RGBA
и с любым типом (UNSIGNED_BYTE
или UNSIGNED_INT_8_8_8_8_REV
), все отображается нормально!
- Поскольку OpenGL не поддерживает ARGB, использование BGRA понятно. Но почему RGBA здесь работает правильно? Это кажется неправильным.
- Почему тип не влияет на порядок каналов?
- Имеет ли значение GL_UNPACK_ALIGNMENT? Я оставил его по умолчанию (4). Если я правильно прочитал руководство, это не должно повлиять на чтение памяти клиента.
Подробнее
- OpenGL версии 3.3
- Intel HD Graphics с поддержкой до OpenGL 4.0
- Используется GLI для загрузки файла DDS и получения указателя данных.