Введение
Алгоритм сжатия текстур
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 представляла собой серьезное препятствие для реализации с открытым исходным кодом, хотя и существовали подходы к реализации, которые пытались обойти запатентованные части.
S3 Texture Compression (S3TC) (sometimes also called DXTn, DXTC, or BCn) is a group of related lossy texture compression algorithms originally developed by Iourcha et al. of S3 Graphics, Ltd. for use in their Savage 3D computer graphics accelerator. The method of compression is strikingly similar to the previously published Color Cell Compression, which is in turn an adaptation of Block Truncation Coding published in the late 1970s. Unlike some image compression algorithms (e. g. JPEG), S3TC's fixed rate data compression coupled with the single memory access (cf. Color Cell Compression and some VQ based schemes) made it well suited for use in compressing textures in hardware accelerated 3D computer graphics. Its subsequent inclusion in Microsoft's DirectX 6.0 and OpenGL 1.3 (via the GL EXT texture compression s3tc extension) led to widespread adoption of the technology among hardware and software makers. While S3 Graphics is no longer a competitor in the graphics accelerator market, license fees have been levied and collected for the use of S3TC technology until October 2017, for example in game consoles and graphics cards. The wide use of S3TC has led to a de facto requirement for OpenGL drivers to support it, but the patent encumbered status of S3TC presented a major obstacle to open source implementations, while implementation approaches which tried to avoid the patented parts existed.
Патент
Некоторые (например, 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.
Otherwise, if , four other alpha values are calculated such that , , , and with and
The lookup table is then consulted to determine the alpha value for each pixel, with a value of 0 corresponding to and a value of 7 corresponding to DXT4's color data is premultiplied by alpha, whereas DXT5's is not. Because DXT4/5 use an interpolated alpha scheme, they generally produce superior results for alpha (transparency) gradients than 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.
BC7 encodes 16 input RGB8/RGBA8 pixels into 128 bits of output. It can be understood as a much enhanced BC3. crunch is another tool that performs RDO and optionally further re encoding. In 2021, Microsoft produced a "BCPack" compression algorithm specifically for BCn compressed textures. Xbox series X and S have hardware support for decompressing BCPack streams.