次の方法で共有


ディスプレースメント マッピング

ディスプレースメント マッピング

ディスプレースメント マップはテクスチャ マップと似ているが、頂点エンジンが処理する。

ブロック図

頂点パイプラインの初めの方に追加のサンプラ ステージがあり、ここで、ディスプレースメント マップをサンプリングして頂点ディスプレースメント データを提供する。

テセレータのブロック図

ディスプレースメント マップ サンプラ ステートは、IDirect3DDevice9::SetSamplerState でステージ番号 256 を使って設定できる。これは新しいステージ番号である。ディスプレースメント マップ テクスチャは、IDirect3DDevice9::SetTexture で設定する。

このマップはプリサンプリングしてもしなくてもよい。つまり、ディスプレースメント値をフィルタリングしないで参照する場合と同じ方法で要求できる。

  • ディスプレースメント マップはテクスチャ マップと似ているが、頂点エンジンでアクセスする。
  • 頂点パイプラインの初めの方には、ディスプレースメント マップをサンプリングする追加のサンプラ ステージがある。このステージには通常の SetSamplerState アプリケーション プログラミング インターフェイス (API) を使ってアクセスするが、ステージ番号は D3DDMAPSAMPLER = 256 である。
  • ディスプレースメント マップ サンプラ ステートを設定するには、SetSamplerState(D3DDMAPSAMPLER, ...) API を使う。
  • ディスプレースメント マップ テクスチャは、SetTexture(D3DDMAPSAMPLER, texture) API で設定する。
  • このマップはプリサンプリングしてもしなくてもよい。つまり、ディスプレースメント値をフィルタリングしないで参照する場合と同じ方法で要求できる。
  • 宣言構造の変更により、テクスチャ マップの参照にテクスチャ座標の仕様を使えるようになった。たとえば、Stream0, Offset, FLOAT2, LOOKUP, Displacement_value とする。これは、特定のオフセットで Stream0 の 2D 浮動ベクトルをテクスチャ座標として使ってディスプレースメント マップを参照し、Displacement_value の使用法のセマンティクスをこれに関連付けるよう、テセレータに指示する。頂点シェーダの宣言には {dcl_texture0, v0} に類似した行があり、texture0 セマンティクスを v0 入力レジスタと関連付けることを示している。参照されているディスプレースメント値を入力レジスタ v0 にコピーする。
  • テクスチャ マップをプリサンプリングする場合は、専用のディスプレースメント マッピングを使える。生成された頂点のシーケンシャル インデックスをテクスチャ マップのテクスチャ座標として使う。たとえば、0,0,(D3DDECLTYPE)0,D3DDECLMETHOD_LOOKUPPRESAMPLED, Usage, UsageIndex とする。
  • 参照の出力は 4 つの浮動小数点数である。
  • ディスプレースメント マッピングがサポートされるのは N パッチの場合だけである。
  • ディスプレースメント マッピングを処理できないドライバは、SetTextureStageState の D3DDMAPSAMPLER を無視する必要がある。
  • D3DTEXF_ANISOTROPIC フィルタ モードはサポートされていない。
  • ディスプレースメント マップ サンプラの D3DSAMP_MIPFILTER が D3DTEXF_NONE でない場合は、詳細レベル (LOD) を次のように計算する。D3DRS_ENABLEADAPTIVETESSELLATION が FALSE であっても適応型テセレーション ステートが使われるので注意すること。
    Tmax = レンダリング ステート D3DRS_MAXTESSELLATIONLEVEL
  • 「適応型テセレーション」で説明した方法と同じ方法で、座標 (Xi, Yi, Zi) の頂点 Viのテセレーション レベルを計算する。計算式は、LOD L = log2(Tmax) - log2 (Te)。
  • テクスチャ フィルタリングおよびサンプリング処理は、ピクセル パイプラインと同じルール (詳細レベル (LOD) バイアスの適用など) に従う。
  • ディスプレースメント マップとして使えるのは、D3DUSAGE_DMAP をサポートしているフォーマットだけである。アプリケーションは、IDirect3D9::CheckDeviceFormat を使ってこれを問い合わせることができる。
  • このテクスチャをディスプレースメント マップとして使うことをドライバに通知するために、IDirect3DDevice9::CreateTexture に D3DUSAGE_DMAP を設定する必要がある。
  • D3DUSAGE_DMAP は、テクスチャと同時に使う。キューブ マップやボリュームと同時には使えない。
  • D3DUSAGE_DMAP で作成したテクスチャとレンダリング ターゲットは、標準のサンプラ ステージにレンダリング ターゲットとして設定できる。
  • ディスプレースメント マッピングでは、テクスチャ座標のラップ モードを設定するレンダリング ステートを無視する。通常、テセレータ エンジンに使えるラップ モードはない。
  • ディスプレースメント マップ サンプラの動作は、ピクセル テクスチャ サンプラの動作と同じである。4 チャンネル未満のテクスチャ (R32f など) が参照されている場合、参照されている値は出力レジスタ (_sample セマンティクスを使ってタグ付けした頂点シェーダ入力レジスタ) の適切なチャンネルに送られる。その他のチャンネルは、デフォルトで (1, 1, 1) になる。参照されると、D3DFMT_L8 は R、G、B チャンネルにブロードキャストされ、A はデフォルトで 1 になる。完全な実装の詳細はリファレンス ラスタライザによって決まる。

プリサンプリングするディスプレースメント マッピング

  • 新しいサンプリング ステートD3DSAMP_DMAPOFFSET (DWORD) が導入された。このステートは、プリサンプリングしたディスプレースメント マップをオフセット (頂点単位で) する。
  • 新しい宣言メソッドD3DDECLMETHOD_LOOKUPPRESAMPLED が導入された。
  • 適応型テセレーションは無効にすること。
  • テクスチャ フィルタ設定は無視される。ポイント サンプリングが行われる。ミップ テクスチャ フィルタは D3DTEXF_NONE であると仮定される。その他のテクスチャ フィルタ モードはすべて D3DTEXF_POINT であると仮定される。
  • テクスチャ座標は、U = (Index % TextureWidthInPixeles) / (float)(TextureWidthInPixeles) V = (Index / TextureWidthInPixeles) / (float)(TextureHeightInPixeles) のように計算される。ここで、Index は、生成される頂点のシーケンシャル インデックスと TSS[D3DSAMP_DMAPOFFSET] の和である。シーケンシャル インデックスは、各プリミティブの初めでゼロに設定され、頂点が生成されるたびに大きくなる。

ディスプレースメント マッピングをサポートするための API の変更事項を次に示す。

  • 単一チャンネル フォーマット D3DFMT_L16 が追加された。
  • 新しい利用法フラグ D3DUSAGE_DMAP が追加された。
  • ディスプレースメント マップ テクスチャを設定するための専用のテクスチャ ステージ D3DDMAPSAMPLER が追加された。
  • 新しいハードウェア能力 D3DDEVCAPS2_DMAPNPATCH および D3DDEVCAPS2_PRESAMPLEDDMAPNPATCH が追加された。「D3DDEVCAPS2」を参照すること。