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

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

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


person Andrew Grant    schedule 21.08.2008    source источник


Ответы (4)


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

person James Sutherland    schedule 21.08.2008

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

person Alundaio    schedule 31.01.2017

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

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

person Chris Blackwell    schedule 25.08.2008

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

person starmole    schedule 22.05.2012