Алгоритмы сжатия игровых текстур. Часть 3.

BC6H

Алгоритм предназначен для сжатия текстур с широким динамическим диапазоном (HDR) и поддерживается аппаратно с DX11. Имеет 128 бит на блок и не имеет альфа-канала.

Алгоритм имеет очень гибкий алгоритм сжатия. У алгоритма есть 2 варианта: знаковый и беззнаковый (для представления значений цветовых каналов), а также следующие «фишки»:
· endpoints and indices
· delta compression
· partitioning

А ещё различные алгоритмы сжатий блока, которые применяются по ситуации в дополнении к имеющимся.

Еndpoints and indices
Этот приём уже есть в предыдущих алгоритмах ВС: сначала определяются 2 крайние точки (или 4 если блок делится на 2 региона), а 16 промежуточных цветов интерполируются линейно:

28.jpg

Рисунок 25. Схематическое представление интерполяции цветов в ВС6Н.

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

Partitioning
Данный режим позволяет дробить блок на 2 сегмента (сабсета) для более точного воспроизведения цветов внутри каждого блока. Всего существует 64 заранее прописанных вариации разбиения для 2 сегментных блоков (см. рис. 26). Внутри каждого блока определяются свои крайние точки и интерполируются значения промежуточных пикселей. Такой режим применяется в наиболее сложных для сжатия участках текстуры.

29.jpg

Рисунок 26. 64 варианта разбиения блока на 2 сегмента.

Delta compression
Первая точка (цвет) хранится в высоком качестве, а вместо второй – значение смещения первой точки, чтобы получить вторую. Дельта компрессия применяется в тех блоках, где цвета очень близки к друг другу, и вместо того, чтобы хранить 2 крайние точки, хранят точное значение первой и смещение для интерполяции второй.

30.jpg

Рисунок 27. Интерполяция точки из базовой

Такой подход можно использовать и в сложном для кодирования блоке: делим на 2 части (см. Partitioning), а потом внутри этих подблоков задаём смещением всех крайних точек относительно базовой. Это позволит сэкономить место в блоке (размер блока фиксированный, а хранить полноценные 4 точки снизит битность) и уменьшить искажения цвета при кодировании.

Кроме вышеописанных фишек есть 14 режимов пожатия (типов блоков) которые кодируются в цвете базовой точки:
·1 не использует разбиение или дельта компрессию;
·3 используют только дельта компрессию;
·1 использует только разбиение;
·9 разбиение + компрессия.

Таким образом, алгоритм имеет большой выбор из инструментов для сжатия каждого блока. С одной стороны, это плюс: потери в качестве минимальны. С другой, каждый блок приходится сжимать 320 раз, перебирая все возможные комбинации, а потом среди них искать самый удачный экземпляр. И так с каждым блоком 4х4 пикселя. Поэтому для сокращения времени существуют пресеты: от низкокачественного и быстрого до качественного и долгого. И если в высококачественном пресете будут перебраны все возможные варианты сжатия каждого блока, то в более низкокачественных выбор инструментария, используемого алгоритмом, будет ограничиваться. Так в самом низком пресете будет использоваться режим похожий к ВС1.

31.jpg

Рисунок 28. Сравнение потери качества между алгоритмами и исходным файлом tga. Low и hi – низкое и высокое качество соответственно

BC7

Идейно схож с ВС6Н, однако, в отличие от него алгоритм поддерживает альфа-канал. Кроме того, у BC7 меньше режимов пожатия (типов блоков) – 8 против 14. Альфу поддерживает только вторая половина блоков, первая половина используется для сжатия текстур без альфа-канала.
Кроме этого, ВС7 в сложных случаях кодировки блока использует дробление блока на 1, 2 и 3 зоны (см. рис.).

32.jpg

Рисунок 29. доступные для BC7 дополнительные 64 варианта разбиения блока на 3 сегмента.

Ещё из занятных особенностей можно выделить использование общих битов для кодирования базовых цветов:
P-bit – общий бит для всех трёх каналов одного базового цвета. При сжатии цвет подбирается таким образом, что у последних битов 3 каналов одинаковое значение, которое хранится отдельно. При распаковке оно подставляется обратно. Таким образом можно сэкономить целых 2 бита с одного цвета.

33.jpg

Рисунок 30. схема использования P-bit.

P-shared – общий бит для одной пары базовых цветов:

34.jpg

Рисунок 31. схема использования P-shared.

Все 8 режимов, которые по своему усмотрению используют алгоритм, разнятся. Связано это с максимально эффективным использованием 128 битов на блок.

Table_1.png


Как видно из таблицы, на кодировку двух и трёх регионного разбиения отводится 4 или 6 бит. Соответственно, режим сжатия может использовать либо первые 16 вариантов из двух и трёх регионного разбиения, либо все из обеих таблиц.

В алгоритме BC7 нет чёткого разбиения 128 бит на блок RGB и блока альфы, как это было, к примеру, в BC2 и ВС3 — по 64 бита. Тут соотношение из отведённого места в 128 бит на триплет (RGB) цвета и альфу подбирается для каждого блока по отдельности. Обратите внимание на деградацию
передачи цвета на примере (см. рис. 32) при пустом альфа-канале (белом), полностью чёрном и последнем варианте с альфой. Чем сложнее альфа-канал в блоке, тем больше на него нужно места и тем меньше остаётся на RGB из отведённых 128 бит на блок.

35.jpg

Рисунок 32. Сравнение сжатия между алгоритмами BC6 и BC7. BC6 альфу не поддерживает, а для левого варианта ВС7 использован исходник без альфа-канала.

Выводы

36.jpg

Рисунок 32. Сравнение алгоритмов семейства.

BC1

Высокое сжатие с потерями в цвете. Полноценный альфа-канал не поддерживается,но есть 1 битная альфа за счёт 1 цвета в блоке. Каналы связаны между собой, поэтому алгоритм плохо подходит для хранения карты нормалей.

BC2

Блок ВС1 + полноценный альфа канал с 16 цветами с более низким уровнем шума чем на ВС3.

ВС3

Блок ВС1 + полноценный альфа-канал с 256 цветами. Шумность выше, чем у ВС2, но практически незаметен, благодаря чему алгоритм получил широкое распространение. Есть подвид ВС3n для нормала (красный и зелёный каналы исходника перемещаются в зелёный и альфа-канал dds соответственно).

ВС4

Блок альфа-канала ВС3. При конвертации по умолчанию будет конвертироваться из красного канала исходника. Альфа-канала нет.

ВС5

2 блока альфа-канала ВС3 для нормал мапы. При конвертации по умолчанию будет конвертироваться из красного и зелёного канала исходника. Альфа-канала нет.

ВС6Н

Поддержка HDR. Альфа-канал не поддерживается. Артефакты минимальны.

ВС7

Eсть альфа-канал, но поскольку блок не делится между альфой и RGB, то на количество артефактов и потерю цвета влияет сложность альфа-канала в блоке.

Семейство S3TC имеет очень большую поддержку со стороны железа и используется в подавляющем количестве игр. Для работы с форматом семейства (*.dds) есть как аддоны для графических программ, так и отдельные утилиты для сжатия с богатым функционалом.


Table_2.png

Продолжение будет в следующем посте.

708 0 850 4
2
2025-07-01
Спасибо за статью!
2025-07-09
Очень наглядно и интересно, благодарю!
RENDER.RU