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