圧縮テクスチャの使用 (Direct3D 9)
圧縮テクスチャのサポートの決定
アダプターをテストするには、DXT1、DXT2、DXT3、DXT4、または DXT5 を使用するピクセル形式を指定します。 IDirect3D9::CheckDeviceFormat がD3D_OKを返す場合、デバイスは、その形式を使用する圧縮テクスチャ サーフェスから直接テクスチャを作成できます。 その場合は、 IDirect3DDevice9::SetTexture メソッドを呼び出すことで、Direct3D で圧縮テクスチャ サーフェスを直接使用できます。 次のコード例は、アダプターが圧縮テクスチャ形式をサポートしているかどうかを判断する方法を示しています。
BOOL IsCompressedTextureFormatOk( D3DFORMAT TextureFormat,
D3DFORMAT AdapterFormat )
{
HRESULT hr = pD3D->CheckDeviceFormat( D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL,
AdapterFormat,
0,
D3DRTYPE_TEXTURE,
TextureFormat);
return SUCCEEDED( hr );
}
デバイスが圧縮テクスチャ サーフェスからのテクスチャ変換をサポートしていない場合でも、テクスチャ データを圧縮形式のサーフェスに格納できますが、テクスチャをテクスチャリングに使用するには、圧縮されたテクスチャをサポートされている形式に変換する必要があります。
圧縮テクスチャの作成
アダプターで圧縮テクスチャ形式をサポートするデバイスを作成したら、圧縮テクスチャ リソースを作成できます。 IDirect3DDevice9::CreateTexture を呼び出し、Format パラメーターに圧縮テクスチャ形式を指定します。
テクスチャ オブジェクトにイメージを読み込む前に、 IDirect3DTexture9::GetSurfaceLevel メソッドを呼び出してテクスチャ サーフェスへのポインターを取得します。
これで、任意の D3DXLoadSurfacexxx 関数を使用して、 IDirect3DTexture9::GetSurfaceLevel を使用して取得されたサーフェスにイメージを読み込むことができます。 これらの関数は、圧縮テクスチャ形式との間の変換を処理します。
DirectX SDK に付属の DirectX テクスチャ エディター (Dxtex.exe) を使用して、圧縮テクスチャ (DDS) ファイルを作成および変換できます。 Dxtex.exeを取得し、DirectX SDK からその詳細を確認できます。 DirectX SDK の詳細については、「 DirectX SDK はどこにありますか?」を参照してください。
この動作の利点は、特定の幅と高さのサーフェスに必要なストレージの量を特定の形式で計算することなく、アプリケーションが圧縮サーフェスの内容をファイルにコピーできることです。
次の表に、5 種類の圧縮テクスチャを示します。 データの格納方法の詳細については、「 圧縮テクスチャ形式 (Direct3D 9)」を参照してください。 この情報は、独自の圧縮ルーチンを作成する場合にのみ必要です。
FOURCC | 説明 | アルファプリマルチプライド? |
---|---|---|
DXT1 | 不透明/1 ビットアルファ | 該当なし |
DXT2 | 明示的なアルファ | はい |
DXT3 | 明示的なアルファ | いいえ |
DXT4 | 補間されたアルファ | はい |
DXT5 | 補間されたアルファ | いいえ |
非乗算形式から事前乗算形式にデータを転送すると、Direct3D はアルファ値に基づいて色をスケーリングします。 事前乗算形式から非乗算形式へのデータ転送はサポートされていません。 事前乗算されたアルファ ソースから非プリ乗算アルファ変換先にデータを転送しようとすると、メソッドは D3DERR_INVALIDCALLを返します。 事前乗算されたアルファ ソースからアルファを持たない変換先にデータを転送すると、アルファでスケーリングされたソース カラー コンポーネントがそのままコピーされます。
圧縮テクスチャ サーフェスの展開
テクスチャ サーフェスの圧縮と同様に、圧縮されたテクスチャの圧縮解除は Direct3D コピー サービスを通じて実行されます。
圧縮されたテクスチャ サーフェスを非圧縮テクスチャ サーフェスにコピーするには、 関数 D3DXLoadSurfaceFromSurface を使用します。 この関数は、圧縮されたサーフェスと圧縮されていないサーフェスとの間の圧縮を処理します。
関連トピック