頂点テクスチャ
頂点テクスチャ
このシェーダ モデルは、texldl を使った頂点シェーダによるテクスチャ ルックアップをサポートする。頂点エンジンには、4 つのテクスチャ サンプラ ステージが含まれ、その名前は D3DVERTEXTEXTURESAMPLER、D3DVERTEXTEXTURESAMPLER+1、D3DVERTEXTEXTURESAMPLER+2、および D3DVERTEXTEXTURESAMPLER+3 である。これらは、ピクセル エンジンのディスプレースメント マップ サンプラやテクスチャ サンプラとは異なる。
これら 4 つのステージに設定されたテクスチャは、頂点エンジンを使ってサンプリングでき、ステージは IDirect3D9::CheckDeviceFormat を使ってプログラミングできる。これらのステージにテクスチャを設定するには、ステージ インデックス D3DVERTEXTEXTURESAMPLER ~ D3DVERTEXTEXTURESAMPLER+3 と共に、IDirect3DDevice9::SetTexture を使う。新しいレジスタとしてサンプラ レジスタが頂点シェーダに導入された。このレジスタは、ps_2_0 と同じように、頂点テクスチャ サンプラを表す。このレジスタは、使用前にシェーダで定義する必要がある。
アプリケーションは D3DUSAGE_QUERY_VERTEXTEXTURE と共に IDirect3D9::CheckDeviceFormat を呼び出して、フォーマットが頂点テクスチャとしてサポートされているかどうかを問い合わせることができる。
注 これらは問い合わせフラグなので、Createxxx 関数では使えない。POOL_DEFAULT で作成された頂点テクスチャは、ピクセル テクスチャとして設定でき、その逆も可能である。ただし、ソフトウェア頂点処理を使うためには、ミックス モード デバイスであるかソフトウェア頂点処理デバイスであるかを問わず、頂点テクスチャは POOL_SCRATCH で作成しなければならない。
この機能は、次の点を除いて、ピクセル テクスチャと同じである。
- 異方性テクスチャ フィルタリングはサポートされないので、D3DSAMP_MAXANISOTROPY は無視され、これらのステージに対して D3DTEXF_ANISOTROPIC を MAGFILTER または MINFILTER に設定することはできない。
- 変更レート情報は利用できないので、アプリケーションは詳細レベル (LOD) を計算し、その情報をパラメータとして texldl に渡す必要がある。
次のような制限がある。
- ピクセル シェーダと同じように、複数要素テクスチャがサポートされる場合、サンプリングの対象となる要素を判断するために、D3DSAMP_ELEMENTINDEX が使われる。
- ステート D3DSAMP_DMAPOFFSET は、これらのステージに対して無視される。
- 頂点テクスチャとして使えるかどうかを判断するには、D3DUSAGE_QUERY_VERTEXTEXTURE と共に IDirect3D9::CheckDeviceFormat を使ってテクスチャに問い合わせる。
- 新しい D3DCAPS9 の新しいフィールドである VertexTextureFilterCaps は、頂点テクスチャ サンプラで使用可能なフィルタの種類を示す。D3DPTFILTERCAPS_MINFANISOTROPIC および D3DPTFILTERCAPS_MAGFANISOTROPIC は許可されない。
サンプリング ステージ レジスタ
サンプリング ステージ レジスタは、テクスチャ ロード文で使うサンプリング ユニットを指定する。サンプリング ユニットはテクスチャ サンプリング ステージに対応し、IDirect3DDevice9::SetSamplerState に指定されるサンプリング固有のステートをカプセル化する。
個々のサンプラは、対応するサンプラに IDirect3DDevice9::SetTexture を使って設定された単一のテクスチャ サーフェイスを一意に指定する。ただし、同じテクスチャ サーフェイスを複数のサンプラに設定することは可能である。
テクスチャは、描画時にはレンダリング ターゲットおよびテクスチャ ステージに同時に設定することはできない。
vs_3_0 では 4 つのサンプラをサポートするので、1 つのシェーダ パスで、最大 4 つのテクスチャ サーフェイスを読み取ることができる。サンプラ レジスタは、テクスチャ ロード文 texldl の引数としてのみ表示される。
vs_3_0 では、サンプラを使う場合、ps_2_0 と同じように dcl_textureType を使って、シェーダ プログラムの最初にサンプラを宣言する必要がある。
ソフトウェア処理
この機能は、ソフトウェア頂点処理でサポートされる。サポートされるフィルタの種類を調べるには、IDirect3DDevice9::GetDeviceCaps を呼び出し、D3DCAPS9 の VertexTextureFilterCaps メンバを調べる。公開済みのすべてのテクスチャ フォーマットは、ソフトウェア頂点処理で頂点テクスチャとしてサポートされる。
ソフトウェア頂点処理モードで特定のテクスチャ フォーマットがサポートされているかどうかをアプリケーションが調べるには、IDirect3D9::CheckDeviceFormat を呼び出し、使用設定として (D3DUSAGE_QUERY_VERTEXTEXTURE | D3DUSAGE_SOFTWAREPROCESSING) を指定する。すべてのフォーマットはソフトウェア頂点処理でサポートされる。ソフトウェア頂点処理には POOL_SCRATCH が必要である。
API の変更
// New define #define D3DVERTEXTEXTURESAMPLER0 (D3DDMAPSAMPLER+1) #define D3DVERTEXTEXTURESAMPLER1 (D3DDMAPSAMPLER+2) #define D3DVERTEXTEXTURESAMPLER2 (D3DDMAPSAMPLER+3) #define D3DVERTEXTEXTURESAMPLER3 (D3DDMAPSAMPLER+4) // New usage #define D3DUSAGE_QUERY_VERTEXTEXTURE (0x00100000L) // New caps field in D3DCAPS9 DWORD VertexTextureFilterCaps;