DXTCフォーマットとは?

普段淡々と製作状況を書くだけのことが多いですが、たまにはノウハウ的なことも書いてみようと思います。
自分の備忘録の意味もありますが、このブログはシーナリーの製作の経験者や製作に興味のある方なども見に来ているようですので。

今回のテーマはFSXのテクスチャでも使われるDXTCフォーマットについてです。

この記事を書くにあたって下記のHPなどを参考にしました。
DXTC(S3TC)圧縮のアルゴリズムとは?~前編~
DXTC(S3TC)圧縮のアルゴリズムとは?~後編~

 

DXTCとは

そもそもDXTCとは何かというと、画像圧縮アルゴリズムの一種で、DirectX Texture Compressionの略称です。
名前の通りDirectXが標準でサポートする画像形式のひとつです。

DXTCはJPEG等と比べると圧縮率は低いのですが、画像を圧縮したままGPUのVRAMに置いて使うことができる、という利点があります。
もしテクスチャとしてJPEGを使うような3Dプログラムを作ったとしても、GPUはそのままJPEGを扱うことができないため、JPEG画像を無圧縮状態に展開してGPUに送る必要があります。
これに対し、DXTCでは圧縮したままGPUで扱うことができるので、VRAM容量やメモリバンド幅の占有が少なくてすみます。

 

DXT1・DXT3・DXT5の違い

DXTCの圧縮アルゴリズムにはDXT1~DXT5の5種類があり、そのうちFSXで使用できるのはDXT1・DXT3・DXT5の3種類です。

これらの違いはアルファチャンネルにあります。
それぞれのアルファチャンネルは次のようになっています。

DXT1 アルファチャンネルなし
DXT3 固定の16階調のアルファチャンネル
DXT5 代表2値+補間6値  または
0+代表2値+補間4値+255
より高い階調のアルファチャンネルが使用可能

ちなみにDXT2とDXT4では乗算済みアルファというものが使われるようです。

FSXではDXT5を使っておけば間違いない、と覚えていてあまり違いを意識していない方もいるかもしれませんが、DXT3・DXT5はDXT1よりアルファチャンネルの分データサイズが大きくなります。
シビアにパフォーマンスを考えるなら、アルファチャンネルが不要な場合はDXT1を使用したほうがいいかもしれません。

では透過部分を含むテクスチャはDXT5にしておけばいいのかというと、そういうわけでもありません。

DXT5のアルファ値は0~255の間のある範囲を8階調で表現します。
このため、使用するアルファ値の範囲が狭い場合は細かい階調が表現できますが、使用するアルファ値の範囲が広くなるとDXT3よりも階調表現が劣ってしまいます。
DXT3は階調はおおざっぱだが広い範囲が使用可能、DXT5はアルファ値の範囲を狭くすれば細かい階調が表現可能といった特徴があります。

FSXの場合だと、ひとつのテクスチャで細かい階調で透明度が変化するような表現はあまり必要ではないように思います。
このようなことを考えると、FSXの透過テクスチャにはDXT3のほうが適しているような気がします。

DXTCに変換した後に、アルファチャンネルの表現に不満がある場合は、フォーマットを変えると改善する場合があります。
特に不満がなければどちらでもあまり違いはないかもしれません。

 

圧縮による画質の劣化

DXTCは非可逆圧縮のため、画像が劣化します。
このため、小さいサイズ(解像度)のテクスチャを大きな面に張り付けたりすると、ノイズが目立つことがあります。

また、画像によって劣化が激しい場合と、あまり劣化しない場合があるようです。
詳しくは冒頭リンクの前編を見てほしいのですが、DXTCでは4×4ピクセルを1つのブロックとして扱うのですが、この4×4ピクセルのブロックにはっきりと諧調の違う色が3色以上含まれているような場合、劣化が大きくなるようです。

線幅1ピクセルの線を多用するとこのような劣化の大きいブロックが発生しやすくなるのではないかと思います。
このあたりに気を付けると劣化を少なくできそうです。

また、これも詳しいことは上記リンクに書かれているのですが、DXTC圧縮では1ブロックごとに代表色2色と中間色2色の計4色を選択し、全てのピクセルをこの4色に置き換えるのですが、この4色をどのように選択するかについては規定されていません。
このため、この4色の選び方によって圧縮後の結果が変わってきます。
言い換えると、圧縮ツールによって劣化具合が異なります。
DXTC変換したときに劣化が激しい場合、別のツールで変換すると改善する場合があります。
といっても、圧縮アルゴリズムが大きく変わるわけではないので、あまり大幅な改善は期待できませんが。

私の個人的な感想になりますが、FSX SDKに付属のImage Toolはあまり画質はよくないように思います。
私はほかにDirectX SDKに付属している変換ツールも併用していて、劣化が気になる場合に使ってみたりしています。
ただし、DirectX SDK付属のツールを使うとなぜか上下が反転するので、変換する前に画像を上下反転させるひと手間が必要になります。

 


 

いかがだったでしょうか。
かなりニッチな内容になってしまったのと、文字ばかりで読みづらい記事になってしまった気がしますが、これからも気が向いたらこのような記事も書いてみようかと思います。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください