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

StackOverflow https://stackoverflow.com/questions/19448

Вопрос

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

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

Это было полезно?

Решение

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

Другие советы

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top