vs_3_0 の頂点テクスチャー (DirectX HLSL)

頂点シェーダー 3.0 モデルでは、texldl - vs テクスチャー ロード ステートメントを使用した頂点シェーダーのテクスチャー ルックアップがサポートされます。頂点エンジンには、D3DVERTEXTEXTURESAMPLER0D3DVERTEXTEXTURESAMPLER1D3DVERTEXTEXTURESAMPLER2、および 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;