У меня есть this DDS файл. Я написал простой DDS-ридер, чтобы прочитать заголовок DDS и распечатать его данные на основе спецификации MSDN. В нем говорится, что это RDS DDS с 32 байтами на глубину пикселя и альфа игнорируется, то есть формат пикселей - X8R8G8B8 (или A8R8G8B8). Чтобы проверить это, я также открыл этот файл в шестнадцатеричном редакторе, который показывает первый (то есть из начала ввода данных) 4 байта, как BB GG RR 00
(замените их на правые шестнадцатеричные значения первого пикселя). I read, что функции копирования текстур OpenGL действуют на байты (по крайней мере концептуально), и, следовательно, с его точки зрения, эти данные являются B8G8R8A8. Пожалуйста, исправьте меня, если мое понимание здесь не так.Загрузка несжатого DDS в текстуру GL
Теперь glTexImage2D
внутреннего формат проходит RGBA8
и внешнего формат и типа проходит BGRA
и UNSIGNED_BYTE
. Это приводит к синему оттенку в визуализированном выходе. В моем шейдере фрагмента, просто чтобы проверить, я сделал swizzle для обмена R
и B
, и он корректно отображает.
Я вернулся код шейдера, а затем заменил тип из UNSIGNED_BYTE
с UNSIGNED_INT_8_8_8_8_REV
(на основе this suggestion) и по-прежнему оказывает синий оттенок. Теперь изменив внешний формат на RGBA
и с тип (UNSIGNED_BYTE
или UNSIGNED_INT_8_8_8_8_REV
) он делает штраф!
- Поскольку OpenGL не поддерживает ARGB, предоставление BGRA понятно. Но почему RGBA работает правильно здесь? Это кажется неправильным.
- Почему код не влияет на порядок расположения каналов?
- Имеет ли отношение GL_UNPACK_ALIGNMENT к этому? Я оставил его по умолчанию (4). Если я прочитал руководство справа, это не должно повлиять на то, как считывается клиентская память.
Подробности
- OpenGL версии 3.3
- HD Graphics Intel, который поддерживает Шифрование до OpenGL 4.0
- Используется GLI для загрузки файла DDS и получить указатель на данные
Могу ли я взглянуть на читателя? – elect
Назад, когда я спросил об этом, я написал что-то отброшенное. Спасибо вам за то, что спросили, я закончил писать что-то заново: [поделился здесь] (https://gist.github.com/legends2k/97584e4c576d7b5e0dcf)! Как говорится в ответе, вышеупомянутая проблема была вызвана ошибкой в GLI, которая была исправлена в последнее время. – legends2k