Найти в Дзене

Форматы сжатия текстур. DXT 1-5,BC 1-5.


Современные видеокарты как правило хранят текстуры в сжатом виде.
И поскольку декодирование аппаратное то это очень положительно сказывается на производительности, т.к. требует меньший объём памяти и уменьшает объём передаваемых данных в 4-8 раз.

Рассмотрим форматы
DXT - DirectX Texture Compression и BC 4-5.

DXT 1.
При использовании данного алгоритма сжатия изображение разбивается на фрагменты 4х4 пикселя и для каждого такого фрагмента задаются два основных цвета. Каждый цвет занимает 16 бит в формате RGB 5,6,5 по 5 бит на красный и синий каналы и 6 бит на зелёный. Как видите зелёному уделено больше внимания т.к. человеческий глаз особенно чувствителен именно к зелёной составляющей спектра.

Так же по два бита на каждый пиксель матрицы 4х4 которые позволяют задать один из двух заданных цветов и 2 промежуточных варианта на основе линейной интерполяции. Таким образом в пределах одного блока у нас есть 4 разных цвета, 2 заданных и два промежуточных.

Данный формат не поддерживает альфа канал.
Таким образом один блок 4х4 занимает 64 бита(8 байт).

Если нужно сжать изображение с альфа каналом используется DXT 5
по сути это два изображения сжатые
DXT 1 и соответственно размер текстуры удваивается. Но для альфа канала два цвета задаются 8 битами каждый и на один пиксель выделяется 3 бита в итоге получаем не 4,
а 8 градаций и те же 64 бита на блок 4х4. И есть ещё один нюанс в логике
если
Color_1 больше Color_2 интерполируется 6 значений цвета, если-же Color_1 меньше Color_2 интерполируется 4 значения цвета, и задаются два дополнительных значения цвета, для для полностью прозрачного 0 и полностью непрозрачного 1.

пример сжатия блока 4х4

Надо понимать что данные форматы сжимают изображения с потерей качества. Но как правило это не критично.

Так же есть формат
DXT 3 который на блок 4х4 тратит 128 бит(16 байт)
из которых 64 идут на изображение и столько же на альфа канал.
Подходит для изображений с резким изменением альфа-канала.
Используется редко.

Форматы
DXT 2 и DXT 4 были признаны неудачными и распространения не получили.

С выходом
DirectX 10 название DXT 1,3,5 сменились на BC 1-3, и добавились форматы BC 4, BC 5(BC - Block Compression).

BC 4.
Предназначен для сжатия чёрно-белых изображений, например карты высот. Использует абсолютно тот же алгоритм который применяется к альфа каналу в DXT 5(он же BC3).
Существует в двух форматах отличающихся диапазоном значений.
_SNORM диапазон от 0 до 1.
_UNORM диапазон -1 до 1.
Алгоритм при этом не меняется.
Так же как
DXT 1 требует 64 бита на блок 4х4 но поскольку сжимает только один канал, а не три потеря качества существенно меньше.

ВС 5
Данный формат предназначен для сжатия карт нормалей
содержит в себе два блока
BC 4 для сжатия красного и зелёного каналов текстуры, синий просто вычисляется т.к. нормали это единичные вектора.
Соответственно памяти занимает в два раза больше чем
DXT 1
т.к. использует 128 бит на блок 4х4 ,64+64 т.к. красный и зелёный каналы сжимает как отдельные изображения, а значение синего канала просто вычисляет по формуле
sqrt(1-(x² + y²)) где x,y соответствуют R и G.
Привет Пифагору.
Sqrt стандартная функция почти во всех языках программирования - извлечение квадратного корня.

Есть способ использовать для карт нормалей формат
DXT 1,
что позволяет сэкономить память но при этом немного теряется качество.

Выше перечисленные форматы получили широкое распространение на ПК.
На мобильных же устройствах большую популярность получили форматы
ETC 1-2, и хотя они имеют несколько иные алгоритмы но тем не менее близки по сути к формату DXT 1(BC1) c той разницей что работают с блоками 4х2 пикселя при этом обеспечивая близкое качество и такую же степень сжатия.

Разумеется это не все существующие форматы есть и другие, но пока не получившие такого же широкого распространения на ПК.
В частности
BC6H, BC7, ETC 1-2, PACKMAN, ASTC
Некоторые из них используются на мобильных устройствах.
Наиболее интересным выглядит формат
ASTC ,к сожалению на данный момент на ПК нет аппаратной поддержки, но с её появлением вполне возможно что заменит форматы BC 1-5.

Более подробно можете прочитать о них перейдя по второй ссылке в конце статьи. В данной же статье я просто собрал минимум информации который по моему убеждению необходимо знать, что бы правильно назначать тот или иной формат сжатия для текстур, при работе в
Unreal Engine.


Источники информации.
https://docs.microsoft.com/ru-ru/windows/win32/direct3d10/d3d10-graphics-programming-guide-resources-block-compression

https://sv-journal.org/2014-1/06/ru/index.php?lang=en#5-5