Я пытаюсь прочитать информацию об изображении из файла ддс. Мне удалось заставить работать форматы DXT1 и DXT5, однако у меня есть вопрос, касающийся альфа-данных формата DXT3 (также известный как BC2).
При взгляде на макет сжатый Блок BC2, он показывает, что альфа-данные для 16-пиксельного блока хранятся в первых 8 байтах данных, причем каждое значение занимает 4 бита.
Означает ли это, что, поскольку сохраненное альфа-значение может быть только 0-15, фактические альфа-данные рассчитываются следующим образом:
unsigned char bitvalue = GetAlphaBitValue(); // assume this works and gets the 4-bit value i am looking for
unsigned char alpha = (bitvalue / 15.0f) * 255;
Это правильно, или я смотрю на это неправильно?
Это то что эта спецификация кажется, говорит:
Альфа-компонент для текселя в местоположении (x, y) в блоке
задается альфа (х, у) / 15.
Потому что результат должен быть в [0 .. 1], а не [0 .. 255].
Поскольку 255 делится на 15, вероятно, легче представить преобразование в [0 .. 255] как
uint8_t alpha = bitvalue * 17;
Теперь стало более очевидным, что происходит обычное отображение «дублирования» (как, например, короткие цветовые коды CSS), которое обеспечивает хорошее распределение выходных значений (позволяет кодировать как минимальные, так и максимальные значения, и имеет равные шаги между всеми значениями).
Других решений пока нет …