Введение

Алгоритм сжатия текстур
S3 Texture Compression (S3TC) (иногда также называемый DXTn, DXTC или BCn) — это группа связанных алгоритмов сжатия текстур с потерями, первоначально разработанных Iourcha и др. в S3 Graphics, Ltd. для использования в их графическом ускорителе Savage 3D. Метод сжатия удивительно похож на ранее опубликованный Color Cell Compression, который, в свою очередь, является адаптацией Block Truncation Coding, опубликованной в конце 1970-х годов. В отличие от некоторых алгоритмов сжатия изображений (например, JPEG), сжатие данных с фиксированной скоростью в S3TC, в сочетании с однократным доступом к памяти (см. Color Cell Compression и некоторые схемы на основе VQ), делало его хорошо подходящим для сжатия текстур в аппаратно ускоренной 3D-компьютерной графике. Его последующее включение в Microsoft DirectX 6.0 и OpenGL 1.3 (через расширение GL EXT texture compression s3tc) привело к широкому распространению технологии среди производителей аппаратного и программного обеспечения. Хотя S3 Graphics больше не является конкурентом на рынке графических ускорителей, лицензионные отчисления за использование технологии S3TC взимались до октября 2017 года, например, в игровых консолях и графических картах. Широкое использование S3TC привело к фактическому требованию поддержки его драйверами OpenGL, однако патентная обремененность S3TC представляла собой серьезное препятствие для реализации с открытым исходным кодом, хотя и существовали подходы к реализации, которые пытались обойти запатентованные части.

Патент

Некоторые (например, US 5956431 A) из множества патентов USPTO на технологию сжатия текстур S3 Texture Compression истекли 2 октября 2017 года. Однако, как минимум один патент-продолжение, US6,775,417, получил продление срока действия на 165 дней. Срок действия этого патента-продолжения истек 16 марта 2018 года.

Кодеки

Существует пять вариантов алгоритма S3TC (обозначаемых как DXT1–DXT5, в соответствии с кодом FourCC, присвоенным Microsoft каждому формату), каждый из которых предназначен для определенных типов данных изображения. Все они преобразуют блок пикселей 4×4 в 64- или 128-битное значение, что обеспечивает степень сжатия 6:1 для 24-битных RGB-данных или 4:1 для 32-битных RGBA-данных. S3TC — это алгоритм сжатия с потерями, приводящий к ухудшению качества изображения, эффект которого минимизируется за счет возможности увеличения разрешения текстур при сохранении тех же требований к памяти. Изображения, нарисованные от руки в стиле мультфильмов, сжимаются плохо, как и данные карт нормалей, оба из которых часто вызывают артефакты. Алгоритм сжатия 3Dc от ATI является модификацией DXT5, разработанной для устранения недостатков S3TC при работе с картами нормалей. Компания id Software обошла проблемы сжатия карт нормалей в Doom 3, переместив красный компонент в альфа-канал перед сжатием и вернув его на место во время рендеринга в пиксельном шейдере. Как и многие современные алгоритмы сжатия изображений, S3TC определяет только метод декомпрессии изображений, позволяя разработчикам проектировать алгоритм сжатия в соответствии со своими конкретными потребностями, хотя патент по-прежнему распространяется на алгоритмы сжатия. Видеокарты nVidia GeForce 256–GeForce 4 также использовали 16-битную интерполяцию для рендеринга текстур DXT1, что приводило к появлению полос при распаковке текстур с цветовыми градиентами. Это снова создало негативное впечатление о сжатии текстур, не связанное с принципами работы самого кодека.

DXT1

DXT1 (также известный как Block Compression 1 или BC1) является наименьшей разновидностью S3TC, хранящей 16 входных пикселей в 64 битах выходных данных, состоящих из двух 16-битных цветовых значений RGB 5:6:5 и 4x4 двухбитной таблицы подстановки. Если (сравните эти цвета, интерпретируя их как два 16-битных беззнаковых числа), то вычисляются два других цвета, таких, что для каждой компоненты выполняется условие: и . Этот режим работает аналогично режиму 0xC0 оригинального кодека Apple Video. В противном случае, если , то и соответствует прозрачному черному цвету, соответствующему формату альфа-канала с предварительным умножением. Этот цвет иногда вызывает появление черной границы вокруг прозрачной области при использовании линейной фильтрации текстур и альфа-тестирования из-за интерполяции цветов между цветом непрозрачного текселя и соседним черным прозрачным текселем. Затем таблица подстановки используется для определения цветового значения каждого пикселя, где значение 0 соответствует , а значение 3 соответствует .

DXT2 и DXT3

DXT2 и DXT3 (совместно также известные как Block Compression 2 или BC2) преобразуют 16 входных пикселей (соответствующих блоку 4x4 пикселей) в 128 бит выходных данных, состоящих из 64 бит данных альфа-канала (4 бита на пиксель), за которыми следуют 64 бита цветовых данных, закодированных аналогично DXT1 (за исключением того, что всегда используется 4-цветовая версия алгоритма DXT1, а не выбор версии на основе относительных значений и ). В DXT2 цветовые данные интерпретируются как умноженные на альфа, а в DXT3 – как не умноженные на альфа. Как правило, DXT2/3 хорошо подходят для изображений с резкими переходами альфа-канала между полупрозрачными и непрозрачными областями.

DXT4 и DXT5

DXT4 и DXT5 (в совокупности также известные как Block Compression 3 или BC3) преобразуют 16 входных пикселей в 128 бит выходных данных, состоящих из 64 бит данных альфа-канала (два 8-битных значения альфа и таблица поиска 4×4 с 3 битами) и 64 бит цветовых данных (кодируются аналогично DXT1). Если , то вычисляются шесть дополнительных значений альфа, таких что , , , , и . В противном случае, если , вычисляются четыре дополнительных значения альфа, таких что , , , и при этом и . Затем таблица поиска используется для определения значения альфа для каждого пикселя, где значение 0 соответствует , а значение 7 соответствует . Цветовые данные DXT4 предварительно умножаются на альфа, в то время как DXT5 – нет. Поскольку DXT4/5 используют схему интерполяции альфа-канала, они обычно обеспечивают лучшие результаты для альфа- (прозрачности) градиентов, чем DXT2/3.

BC4 и BC5

BC4 и BC5 (Block Compression 4 и 5) добавлены в Direct3D 10. Они повторно используют кодирование альфа-канала, используемое в DXT4/5 (BC3). BC4 сохраняет 16 входных пикселей с одним каналом (например, оттенков серого) в 64 битах выходных данных, закодированных почти без потерь. BC7 кодирует 16 входных пикселей RGB8/RGBA8 в 128 битов выходных данных. Его можно рассматривать как значительно улучшенный BC3. Crunch – это еще один инструмент, выполняющий RDO и, опционально, дополнительное перекодирование. В 2021 году Microsoft разработала алгоритм сжатия "BCPack" специально для текстур, сжатых с использованием BCn. Xbox Series X и S имеют аппаратную поддержку для декомпрессии потоков BCPack.