ディスプレイスメント マッピング (Direct3D 9)

ディスプレイスメント マップは、テクスチャー マップに似ていますが、頂点エンジンによって処理されます。

ブロック図

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

Tessellator block diagram

ディスプレイスメント マップ サンプラー ステートは、新しいステージ番号である、ステージ番号 256 を使用して IDirect3DDevice9::SetSamplerState で設定できます。ディスプレイスメント マップ テクスチャーは 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 をサポートしているフォーマットだけです。アプリケーションは、CheckDeviceFormat 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」を参照してください。