DXTC

DXTC（時々S3 Texture Compression　(S3TC)　ないしDXTnと呼ばれる）は、元々S3社によって開発された画像圧縮アルゴリズム技術である(US Patent #5,956,431)。この技術はSavage 3Dグラフィックスアクセラレータで用いられている。JPEGのような既存の画像圧縮アルゴリズムとは違い、DXTCは（VQのやり方に似た）単純なメモリアクセスと対になった固定レートデータ圧縮を行う。これは3Dコンピュータグラフィックスをハードウェアで支援する際、テクスチャを圧縮するのに適している。この技術は、マイクロソフトのDirectX 6.0に含まれると、ハードウェアやソフトウェアメーカーに広く採用されるようになった。S3社はもはやグラフィックスアクセラレータ市場において、リーディングカンパニーではないが、例えばコンソール用に使われているDXTC技術のライセンス料でいまだ生き長らえている。 DXTCアルゴリズムには5つのバリエーションがある。これらはDXT1からDXT5まであり、それぞれのフォーマットに対してFourCCコードがマイクロソフトによって割り当てられている。これらはそれぞれ特定の種類のイメージデータ用に設計されている。画像はすべてのフォーマットにおいて、64ビットないし128ビットに量子化された4×4ブロックに変換され、32ビットのRGBA入力データは8:1ないし4:1に圧縮される。DXTCは非可逆圧縮アルゴリズムであるため、画像品質は落ちるが、リアルな画像を表示するには、圧縮された画像データでも十分である。アニメ風の画像や法線マップは上手く圧縮することができず、アーティファクトが生じやすい。ATIの3Dc圧縮アルゴリズムは、DXTCが持つ法線マップについての欠点を克服するように設計された、DXT5の変種である。 多くの近代的な画像圧縮アルゴリズムと同様に、実装者が特定のニーズに合わせて圧縮アルゴリズムを設計することができるようにするために、DXTCはただ画像を解凍するのに使われる方法を指定するのみである。しかし特許は圧縮アルゴリズムもカバーしている。初期の圧縮ルーチンは最適化されていなかった。それはどんどん改善されたが、最初DXTCは開発ベンダーに採用されなかった。NVIDIAのGeForceからGeForce 4までのGPUは16ビット補間のDXT1テクスチャ描画を使用していたので、色変化を伴うテクスチャを解凍する時に帯のようなノイズが載っていた。このため、テクスチャ圧縮に対してよくない印象を与えてしまったが、これはコーデック自身に基本的に関係しないものだった。 DXT1は最も簡単なDXTCのバリエーションである。これは、16ピクセル入力から64ビットデータを出力する。この出力は16bit RGB5:6:5　2色と4x4の2ビットのルックアップテーブルからなる。 最初の色 (c0) が2番目の色 (c1) より数値的に大きいならば、他の2つの色は c 2 = 2 3 c 0 + 1 3 c 1 {\displaystyle c_{2}={2 \over 3}c_{0}+{1 \over 3}c_{1}} と c 3 = 1 3 c 0 + 2 3 c 1 {\displaystyle c_{3}={1 \over 3}c_{0}+{2 \over 3}c_{1}} として計算される。このモードはAppleのビデオコーデックのc0モードによく似ている。 逆に c 0 ≤ c 1 {\displaystyle c_{0}\leq c_{1}} なら、 c 2 = 1 2 c 0 + 1 2 c 1 {\displaystyle c_{2}={1 \over 2}c_{0}+{1 \over 2}c_{1}} になり、c3は透過色になる。 ルックアップテーブルはそれぞれのピクセル毎に色値が決定される。 c 0 {\displaystyle c_{0}} だと0に相当し、 c 3 {\displaystyle c_{3}} だと3が相当する。より高圧縮にするためにアルファデータは格納されない。 DXT2とDXT3は16ピクセル入力から128ビットデータに変換する。これは64ビットの色データに続いて64ビットのアルファチャンネルデータ（ピクセルそれぞれについて4ビット）からなり、DXT1と同様の方法でエンコードされる（ただし、アルファなしの4色バージョンが常に使われる）。DXT2では、色データにはあらかじめアルファデータが掛け合わせてあり、DXT3ではアルファデータが掛け合わされていない。普通、DXT2/3は透過色の領域と不透明色の領域の境界が鋭く変化する画像によく合う。 DXT4とDXT5は16ピクセル入力から128ビットデータに変換する。このデータには64ビットの色データ（DXT2ないしDXT3と同じ方法でエンコードされたもの）に続いて、64ビットのアルファチャンネルデータ（2つの8ビットアルファ値と4x4の3ビットルックアップテーブル）からなる。 α 0 > α 1 {\displaystyle \alpha _{0}>\alpha _{1}} であれば、6つの補間用アルファ値を以下の様に計算する。 α 2 = 6 α 0 + 1 α 1 7 {\displaystyle \alpha _{2}={{6\alpha _{0}+1\alpha _{1}} \over 7}} , α 3 = 5 α 0 + 2 α 1 7 {\displaystyle \alpha _{3}={{5\alpha _{0}+2\alpha _{1}} \over 7}} , α 4 = 4 α 0 + 3 α 1 7 {\displaystyle \alpha _{4}={{4\alpha _{0}+3\alpha _{1}} \over 7}} , α 5 = 3 α 0 + 4 α 1 7 {\displaystyle \alpha _{5}={{3\alpha _{0}+4\alpha _{1}} \over 7}} , α 6 = 2 α 0 + 5 α 1 7 {\displaystyle \alpha _{6}={{2\alpha _{0}+5\alpha _{1}} \over 7}} ,　 α 7 = 1 α 0 + 6 α 1 7 {\displaystyle \alpha _{7}={{1\alpha _{0}+6\alpha _{1}} \over 7}} . 逆に α 0 ≤ α 1 {\displaystyle \alpha _{0}\leq \alpha _{1}} であれば、4つの補間用アルファデータを α 2 = 4 α 0 + 1 α 1 5 {\displaystyle \alpha _{2}={{4\alpha _{0}+1\alpha _{1}} \over 5}} , α 3 = 3 α 0 + 2 α 1 5 {\displaystyle \alpha _{3}={{3\alpha _{0}+2\alpha _{1}} \over 5}} , α 4 = 2 α 0 + 3 α 1 5 {\displaystyle \alpha _{4}={{2\alpha _{0}+3\alpha _{1}} \over 5}} , α 5 = 1 α 0 + 4 α 1 5 {\displaystyle \alpha _{5}={{1\alpha _{0}+4\alpha _{1}} \over 5}} と計算する。残り2つは α 6 = 0 {\displaystyle \alpha _{6}=0} と α 7 = 255 {\displaystyle \alpha _{7}=255} とする。ルックアップテーブルはそれぞれのピクセルのアルファ値に従って決定される。 α 0 {\displaystyle \alpha _{0}} は0に割り当てられ、 α 7 {\displaystyle \alpha _{7}} は7に割り当てられる。DXT4の色データはアルファ値がすでに掛け合わせてあり、DXT5の色データはそうではない。DXT4/5は補間アルファ色値を用いているので、DXT2/3よりアルファ値（透過具合）がだんだん変化していくものについては非常によい結果をもたらす。DXT5は最も柔軟な汎用圧縮アルゴリズムだと考えられる。 3Dc FXT1（英語版） DirectDraw Surface この記事は英語版ウィキペディアにある同じ項目の記事の15:20, 19 May 2007の版から翻訳された記事である。 表示 編集