В файле DDS вы можете обнаруживать текстуры с альфа-битами 0/1?


1

В моем движке я должен иметь возможность обнаруживать текстуры DXT1 с текселями с 0 альфа (например, вырез для оконного кадра). Это легко для текстур, которые я сжимаю, но я не уверен в уже сжатых текстурах.

Есть ли простой способ рассказать из заголовка, содержит ли изображение DDS альфа?

2

Насколько я знаю, в заголовке нет возможности рассказать. Есть флаг DDPF_ALPHAPIXELS, но я не думаю, что он будет установлен на основе того, что находится в пиксельных данных. Вам нужно будет разобрать блоки DXT1 и искать цвета, в которых есть 0 альфа (убедившись, что цвет действительно используется в блоке, я тоже полагаю).


0

Я согласен с принятым ответом. Ваша работа может быть сделана немного легче, используя «squish» library для распаковки блоков для вас.

http://www.sjbrown.co.uk/?code=squish


0

DDS является очень плохой оберткой для ЦТСОВ (или BTC) данных. Заголовок не поможет. Обычный оригинал DXT1 не имел альфы. Я считаю, что d3d в настоящее время фактически декодирует DXT1 с альфой. Каждый блок DXT1 выглядит так: color1 (16 бит) color2 (16 бит) индексов (32 бит). Если значение 16 бит color1 меньше, чем color2 (просто сравнение uint16, ничего необычного!), Блок не имеет альфы. В противном случае. Поэтому, чтобы ответить на ваш вопрос: пропустите заголовок, прочитайте 16 бит a, прочитайте 16 бит b, если a> b есть альфа. в противном случае пропустите 32 бита и повторите до тех пор, пока не будет. В других форматах DXT, таких как DXT5, всегда есть альфа. Очень редко люди полагаются на трюк DXT1 alpha, потому что некоторые hw (intel ..) не поддерживают его надежно.


0

Нет, заголовок DDS использует только альфа-флаги для несжатых изображений. У меня была подобная необходимость выяснить, если DXT1 изображение с помощью 1-битного альфа и после долгих поисков я наткнулся на этой ссылке здесь: https://msdn.microsoft.com/en-us/library/windows/desktop/bb147243(v=vs.85).aspx

В принципе, если color_0 < = color_1, то есть возможность текстура имеет 1 -Бит альфа. Чтобы еще раз проверить его, вам нужно проверить следующие 32-битные пары в 2-битных парах, если они равны 11. Затем продолжите это для каждого блока, если он не найден.