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

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

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

21.08.2008 07:33:10
4 ОТВЕТА
РЕШЕНИЕ

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

2
21.08.2008 09:47:32

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

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

0
25.08.2008 20:13:55

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

0
22.05.2012 08:30:08

Нет, заголовок 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. Затем продолжите это для каждого блока, если он не найден.

0
31.01.2017 15:17:42