« 文字列の表示 | メイン | アルファ付きムービーの再生 »

2007年03月30日

吉里吉里 DirectX拡張:: 圧縮テクスチャ

    

DirectX の圧縮テクスチャは、よく考えられたフォーマットだと思う。
簡単な方法で、ある程度圧縮でき、それなりの画質を提供してくれる。

フォーマットの詳細はSDKのヘルプに詳しく書かれているので、ここではその特徴などをまとめておく。

圧縮率は、一定で、1pixel 当り 4bitか8bit。
非可逆圧縮 (フォーマットに適した画像なら可逆)。
幅と高さは4の倍数である必要がある。
色深度は16ビット ( R5G6B5 )
アルファはなしか、深度 1bit、4bit、8bit。
DXT1 ~ DXT5の5種類あるが、基本的にアルファの持ち方が異なるのみ。

画像は、4 * 4のブロックで圧縮される。
そのブロック内で2色を16ビットカラーで保持し、2ビットでどちらかの色、もしくはその中間色かを表すようになっている (16*2 + 2*4*4 = 64 bit、64 / (4*4) = 4 bit/pixel )
つまり、そのままの色で保持されるのはブロック当り2色となる。
中間色は、ブロックごとに次のどちらかで保持される。
① 2/3 色1 + 1/3 色2
② 1/3 色1 + 2/3 色2
の2色の中間色。

1/2 色1 + 1/2 色2
の1色の中間色 (この場合残りの1色は透過色となる)

つまり、4 * 4のブロック内に2色しかない場合は、可逆となる。
2色とその中間値の4色もしくは3色の場合も、可逆となる。
現実的にみて可逆となるケースは少ないが、なくはない。
ただ、実際に変換して見るとわかるが、意外と綺麗。
DirectX の SDK には、DxTex.exe と言う変換ツールが付いているので、簡単に試せる。

アルファは、上述の中間色にある不透明/透明の1bit相当のもの以外に2種類ある。
① 単純に 1 pixel に 4bit 当てて、16階調のアルファを持つ。
② 2種類の8bit アルファ値 + 0と255のアルファ値4種とその中間値を使う。
このどちらかを使う場合、色を含めると 1pixel 当り 8bit になる。


2Dのみの場合、そんなに一度に画像を重ねないだろうから使わなくてもいいかもしれないが、ビデオメモリが少ない場合などを考えて使えるのなら使ったほうがいい。
画像をJPEGで持っているような場合、比較して見るとそれほど違わない時も。
後はテクスチャ ブレンディングで使うこと前提で利用するという手も。



投稿者 Takenori : 2007年03月30日 22:40




comments powered by Disqus
Total : Today : Yesterday : なかのひと