Microsoft DirectX 8.0 (C++) |
DXTex ツールを使うと、DirectX SDK ユーザーは新しい DXTn 圧縮フォーマットを使ってテクスチャ マップを作成できる。DXTn で圧縮されたテクスチャの作成は難しくない。ただし、Direct3D では IDirect3DTexture8 インターフェイスを使うと、自動的にこの変換を行うことができる。知識のある開発者であれば、特定の用途に合った独自のツールを作成することもできるが、DXTex ツールには役に立つ基本的な機能が用意されている。
ソース :(SDK ルート)\Samples\Multimedia\Direct3D\DXTex
実行可能ファイル :(SDK ルート)\bin\dxutils
DxTex では、各テクスチャ マップはドキュメントであり、複数のドキュメントを一度に開くことができる、一般的なユーザー インターフェイス (UI) を使用している。ただし、ドキュメントを DxTex で開いている間は、各ドキュメントでは 1 つまたは 2 つのフォーマットでテクスチャを保持できる。たとえば、.bmp ファイルをインポートし、自動的に 32 ビット ARGB テクスチャを作成できる。次に、このテクスチャを DXT1 フォーマットに変換する。この時点で、ドキュメントにはイメージが 2 つのフォーマットで開かれている。フォーマットを切り替えるには、ウィンドウをクリックするか、[View] メニューの [Original View] または [New View] をクリックする。この方法を使用すると、イメージ圧縮によって生じる不自然な効果を確認でき、イメージを段階的に劣化させることなく別の圧縮形式を試すことができる。たとえば、この方法を使用せずに、イメージを ARGB から DXT1 に変換すると、アルファの 1 ビットを除くすべてのビットが失われる。
その後、DXT2 に変換しても、アルファ レベルは 2 つしか存在しないことになる。DxTex システムでは、この 2 回目の変換は元の ARGB フォーマットから行われ、変換された DXT2 イメージには、DXT2 がサポートする 16 レベルのアルファがすべて含まれる。このイメージを保存すると、元のフォーマットは破棄されて新しいフォーマットのみが保存される。
DxTex インターフェイスを使うときには、次の点に注意すること。
DxTex では、3D ハードウェアが使用可能かどうかに関係なく、Microsoft Direct3D® リファレンス ラスタライザを使ってテクスチャを描画する。したがって、テクスチャが大きい (256x256 ピクセルを超える) 場合、アプリケーションは CPU の速度に応じて若干遅くなることがある。
DxTex ネイティブ ファイル フォーマットは、DirectDrawSurface に情報をカプセル化するので、DDS ファイル フォーマットと呼ばれる。DDS ファイルのフォーマットは、次のとおりである。
DWORD dwMagic (0x20534444, または "DDS") DDSURFACEDESC2 ddsd (サーフェス フォーマットに関する情報を提供する) BYTE bData1[] (メイン サーフェスのサーフェス データ) [BYTE bData2[]...] (アタッチされるサーフェスのサーフェス データ)
このフォーマットは読み書きが簡単で、DXTn 圧縮だけでなく、アルファやマルチ ミップ レベルなどの機能もサポートする。DirectX SDK の Compress サンプル アプリケーションでは、DDS ファイルを正しくインポートする方法を示している。
DXTn 圧縮したテクスチャを使用するために DDS フォーマットを使う必要はなく、その逆の場合も同様であるが、これら 2 つは連携している。
ミップマップは、複数の解像度であらかじめフィルタ処理されたテクスチャ イメージを提供することによって、画質を向上させ、テクスチャ メモリの帯域幅を減少させる手法である。
DxTex のミップマップを生成するには、ソース イメージの幅と高さが共に 2 の累乗になっている必要がある。このミップマップを生成するには、[Format] メニューの [Generate Mip Maps] をクリックする。フィルタリングは、単純なボックス フィルタで実行される。つまり、最も近い 4 つのピクセルが平均化されて目的のピクセルが作成される。
多くのテクスチャ フォーマットには、各ピクセルの不透明度の情報を提供するアルファ チャネルが含まれている。DxTex はテクスチャにおけるアルファを完全サポートする。.bmp ファイルをインポートする場合に、サイズが同じ 2 つのファイルが存在し、その一方のファイル名が "_a" で終わるときには (Sample.bmp および Sample_a.bmp など)、"_a" で終わるファイルがアルファ チャネルとしてロードされる。この 2 つ目の .bmp の青のチャネルがアルファ チャネルに格納される。ファイルを開いた後は、[File] メニューの [Open As Alpha Channel] をクリックして、明示的に .bmp ファイルをアルファ チャネルとしてロードできる。
アルファ チャネルを RGB チャネルなしで直接表示するには、[View] メニューの [Alpha Channel Only] をクリックする。アルファ チャネルがグレースケール イメージとして表示される。アルファ チャネルがロードされていない場合、すべてのピクセルでアルファ チャネルは 100 パーセントとなり、[Alpha Channel Only] を選択するとイメージが白く塗りつぶされる。アルファ チャネルを非表示にするには、[Alpha Channel Only] をもう一度クリックする。
通常のビューではアルファ チャネルの効果が目に見えるが、これは、ウィンドウがバックグラウンド カラーで塗りつぶされており、アルファ チャネルが 100 パーセント未満のテクスチャでは、その色が透けて見えるからである。バックグラウンド カラーを変更するには、[View] メニューの [Change Background Color] をクリックする。この選択を実行しても、テクスチャそのもの、またはファイルを保存するときに書き込まれるデータには影響しない。
DXT2 フォーマットおよび DXT4 フォーマットでは、あらかじめ計算されたアルファが使用される。つまり、サーフェスに格納される赤、緑、および青の値には、対応するアルファ値が既に乗算されている。Direct3D では、あらかじめ計算されたアルファが含まれるサーフェスからあらかじめ計算されていないアルファが含まれるサーフェスにコピーすることはできない。したがって、DxTex の一部の処理 (アルファ チャネルとして開く、DXT3 への変換、および DXT5 への変換) は、DXT2 および DXT4 フォーマットでは実行できない。DXTn テクスチャをサポートしない Direct3D デバイス では、これらのフォーマットを使用したテクスチャをサポートすることは難しい。これは、Direct3D ではこれらのフォーマットを従来のARGB サーフェスへもコピーできないためである。ARGB サーフェスでもあらかじめ計算されたアルファが使用されている場合はコピーできるが、このようなことはまれである。このような理由から、可能であれば DXT2 よりも DXT3 を、DXT4 よりも DXT5 を使用する方が簡単である。
コマンドライン オプションを使って、入力ファイル、出力ファイル名、および処理オプションを DxTex に渡すことができる。出力ファイル名を指定した場合は、その出力ファイルを書き込んだ後にアプリケーションが自動終了し、ユーザー インターフェイスは表示されない。
dxtex [infilename] [-a alphaname] [-m] [DXT1|DXT2|DXT3|DXT4|DXT5] [outfilename] infilename: ロードするファイルの名前。 .bmp または DDS ファイルが可能。 -a alphaname: 次のパラメータはアルファ チャネルとして ロードする .bmp ファイルの名前。 アルファ ファイル名を指定しないと、DxTex は Infilename_a.bmp. という名のファイルを探し、 アルファ チャネルとして使用することに 注意すること。 -m: ミップマップが生成される。 DXT1|DXT2|DXT3|DXT4|DXT5: 圧縮フォーマット。フォーマットを指定しないと イメージは ARGB-8888 となる。 outfilename: 出力ファイル名。 このオプションを指定しないと ユーザー インターフェイスは現在のファイルと すべての必要な操作を表示する。 出力ファイル名を指定すると、 アプリケーションはセーブ後、 ユーザー インターフェイスを表示せずに 終了する。