S3 テクスチャ圧縮( S3TC ) ( DXTn、DXTC、またはBCnとも呼ばれる) は、S3 Graphics, Ltd.の Iourcha らがSavage 3Dコンピュータグラフィックスアクセラレータで使用するために開発した、関連する非可逆テクスチャ圧縮アルゴリズムのグループです[ 1 ] [ 2 ]。圧縮方法は、以前に発表されたColor Cell Compression [ 3 ]と非常によく似ており、Color Cell Compressionは、 1970 年代後半に発表されたBlock Truncation Codingの改良版です。一部の画像圧縮アルゴリズム ( JPEGなど) とは異なり、S3TC の固定レートデータ圧縮と単一のメモリアクセス (Color Cell Compression および一部のVQベースの方式を参照) により、ハードウェアアクセラレーションされた3D コンピュータグラフィックスでテクスチャを圧縮するのに適していました。その後、MicrosoftのDirectX 6.0 およびOpenGL 1.3 (GL_EXT_texture_compression_s3tc拡張機能経由) に組み込まれたことで、ハードウェアおよびソフトウェアメーカーの間でこの技術が広く採用されるようになりました。S3 Graphics はもはやグラフィックス アクセラレータ市場の競合企業ではありませんが、ゲーム コンソールやグラフィックス カードなどでは、2017 年 10 月まで S3TC 技術の使用に対してライセンス料が課せられ、徴収されていました。S3TC の広範な使用により、OpenGL ドライバがそれをサポートすることが事実上必須となりましたが、S3TC の特許による制約がオープンソース実装の大きな障害となり[ 4 ] 、特許部分を回避しようとする実装アプローチも存在しました[ 5 ] 。
S3テクスチャ圧縮に関する複数の米国特許商標庁特許のうち、一部(例えばUS 5956431 A)は2017年10月2日に失効した。[ 6 ]ただし、少なくとも1つの継続特許US6,775,417は165日間の延長があった。この継続特許は2018年3月16日に失効した。
S3TC アルゴリズムには 5 つのバリエーション ( Microsoft が各フォーマットに割り当てたFourCCコードにちなんでDXT1からDXT5と命名) があり、それぞれ特定の種類の画像データ用に設計されています。いずれも 4×4ピクセルのブロックを64ビットまたは 128 ビットの量に変換し、24 ビットRGB入力データでは 6:1、32ビットRGBA入力データでは 4:1 の圧縮率を実現します。S3TC は非可逆圧縮アルゴリズムであるため、画質が劣化しますが、同じメモリ要件を維持しながらテクスチャ解像度を上げることで、その影響を最小限に抑えることができます。手描きの漫画のような画像は圧縮効率が悪く、ノーマル マップデータも同様で、どちらも通常はアーティファクトが発生します。ATIの3Dc圧縮アルゴリズムは、S3TC のノーマル マップに関する欠点を克服するために設計された DXT5 の改良版です。 id Softwareは、Doom 3のノーマルマップ圧縮の問題を回避するために、圧縮前に赤色の成分をアルファチャンネルに移動させ、ピクセルシェーダーでのレンダリング中にそれを戻すという方法をとった。[ 7 ]
多くの最新の画像圧縮アルゴリズムと同様に、S3TCは画像の解凍方法のみを規定しており、実装者は特定のニーズに合わせて圧縮アルゴリズムを設計できますが、特許は依然として圧縮アルゴリズムをカバーしています。Nvidia GeForce 256からGeForce 4までのカードも、DXT1テクスチャのレンダリングに16ビット補間を使用しており、カラーグラデーションのあるテクスチャを展開するとバンディングが発生しました。これもまた、コーデック自体の基本とは関係なく、テクスチャ圧縮の好ましくない印象を与えました。
DXT1(ブロック圧縮1またはBC1とも呼ばれる)はS3TCの最小バリエーションであり、16個の入力ピクセルを64ビットの出力に格納し、2つの16ビットRGB 5:6:5カラー値で構成される。そしておよび4×4の2ビットルックアップテーブル。
もし(これらの色を2つの16ビット符号なし数として解釈して比較し)、次に、各コンポーネントについて、他の2つの色が計算されます。そしてこのモードは、オリジナルのApple Videoコーデックのモード0xC0と同様に動作します。[ 8 ]
そうでなければ、もし、 それからそしては、乗算済みアルファフォーマットに対応する透明な黒色です。この色は、線形テクスチャフィルタリングとアルファテストを使用する場合、不透明なテクセルと隣接する黒色の透明なテクセルの色の間で色が補間されるため、透明領域の周囲に黒い境界線が発生することがあります。
次にルックアップテーブルを参照して各ピクセルの色値を決定します。値0はそして、3に対応する値。
DXT2 と DXT3 (まとめて Block Compression 2 または BC2 とも呼ばれる) は、16 個の入力ピクセル (4x4 ピクセル ブロックに対応) を 128 ビットの出力に変換します。出力は、64 ビットのアルファ チャネルデータ (各ピクセルにつき 4 ビット) とそれに続く 64 ビットのカラー データで構成され、DXT1 と同じ方法でエンコードされます (ただし、DXT1 アルゴリズムの 4 カラー バージョンが常に使用され、相対値に基づいてどのバージョンを使用するかを決定するわけではありません)。そして)
DXT2では、カラーデータはアルファ値が乗算されたものとして解釈されますが、DXT3では乗算されていないものとして解釈されます。一般的に、DXT2/3は、半透明領域と不透明領域の間でアルファ値の遷移が明確な画像に適しています。
DXT4とDXT5(まとめてブロック圧縮3またはBC3とも呼ばれる)は、16個の入力ピクセルを128ビットの出力に変換します。出力は、64ビットのアルファチャンネルデータ(2つの8ビットアルファ値と4×4の3ビットルックアップテーブル)と、それに続く64ビットのカラーデータ(DXT1と同じ方法でエンコード)で構成されます。
もし次に、他の6つのアルファ値が計算され、、、、、、 そして。
そうでなければ、もし、他の4つのアルファ値は次のように計算されます。、、、 そしてとそして。
次にルックアップテーブルを参照して各ピクセルのアルファ値を決定します。値0はそして、7という値はDXT4のカラーデータはアルファ値が乗算されていますが、DXT5は乗算されていません。DXT4/5は補間アルファ方式を採用しているため、一般的にDXT2/3よりもアルファ(透明度)グラデーションにおいて優れた結果が得られます。
Direct3D 10 では、BC4 と BC5 (ブロック圧縮 4 と 5) が追加されました。これらは DXT4/5 (BC3) で使用されているアルファ チャンネル エンコーディングを再利用しています。[ 9 ]
Direct3D 11 では BC6H (場合によっては BC6) と BC7 (ブロック圧縮 6H と 7) が追加されました。[ 9 ]
BC6HとBC7は、エンコードモードの選択により、はるかに複雑なアルゴリズムを採用しています。その結果、品質が大幅に向上しています。[ 9 ]これらの2つのモードは、許容偏差の範囲を含め、より厳密に規定されています。以前のBCnモードでは、GPUベンダーによってデコード方法が若干異なっていました。[ 10 ]
BCnテクスチャは、ディスクへの保存や配布のためにさらに圧縮することができます(テクスチャ超圧縮)。アプリケーションはこの追加の圧縮層を解凍し、通常どおりBCnデータをGPUに送信します。
BCn は、入力テクスチャを変更して BCn 出力がLZ77圧縮機でより簡単に圧縮されるようにする非可逆プリプロセッサである Oodle Texture と組み合わせることができます (レート歪み最適化)。特に BC7 は、テクスチャをより圧縮しやすい形式に再エンコードする非可逆パスである「bc7prep」を使用することもできます (解凍時にその逆が必要になります)。[ 11 ]
crunch は、RDO を実行し、必要に応じてさらに再エンコードを行う別のツールです。[ 12 ]
2021年、マイクロソフトはBCn圧縮テクスチャ専用の「BCPack」圧縮アルゴリズムを開発しました。Xbox Series XとSは、BCPackストリームの解凍をハードウェアでサポートしています。[ 13 ]
... S3テクスチャ圧縮の特許は2017
年10月2日に失効するため、それ以降はFedora上でSteamゲームの動作が改善される可能性がある。
...