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

ディスプレイスメント マップはテクスチャ マップに似ていますが、頂点エンジンからアクセスされます。

ブロック図

次の図に示すように、頂点パイプの初期部分に追加のサンプラー ステージが存在します。このステージでは、ディスプレイスメント マップをサンプリングして頂点の変位データを提供できます。

頂点パイプ内のサンプラー ステージの図

ディスプレイスメント マップ サンプラーの状態は、新しいステージ番号であるステージ番号 256 を使用して SetSamplerState によって設定できます。 ディスプレイスメント マップ テクスチャは SetTexture によって設定されます。

マップは、事前にサンプリングするかしないかを指定できます。つまり、フィルター処理を行わずにディスプレイスメント値を参照できるように順序付けできます。

  • ディスプレイスメント マップはテクスチャ マップに似ていますが、頂点エンジンからアクセスされます。
  • 頂点パイプの初期部分には、ディスプレイスメント マップをサンプリングできる追加のサンプラー ステージが存在します。 このステージには通常の SetSamplerState API がアクセスしますが、ステージ番号は D3DDMAPSAMPLER = 256 です。
  • ディスプレイスメント マップ サンプラーの状態は、SetSamplerState(D3DDMAPSAMPLER, ...) によって設定できます。Api。
  • ディスプレイスメント マップ テクスチャは、SetTexture(D3DDMAPSAMPLER, texture) API によって設定されます。
  • マップを事前にサンプリングするかどうか。 つまり、フィルター処理を行わずにディスプレイスメント値を検索できるようにする特定の方法で並べ替えることができます。
  • 宣言構造の変更により、テクスチャ マップの検索に使用されるテクスチャ座標を指定できます。 たとえば、Stream0、Offset、FLOAT2、LOOKUP、Displacement_value。 これにより、テクスチャ座標として stream0 内の 2D 浮動小数点ベクトルをテクスチャ座標として使用してディスプレイスメント マップを検索し、Displacement_value使用法セマンティックを関連付けるようテセレーターに指示します。 頂点シェーダー宣言には、テクスチャ 0 セマンティックが v0 入力レジスタに関連付けられていることを示す {dcl_texture0, v0} のような行が含まれます。 検索した変位値は、入力レジスタ v0 にコピーされます。
  • テクスチャ マップを事前にサンプリングする場合は、特殊なタイプのディスプレイスメント マッピングがあります。 生成された頂点のシーケンシャル インデックスは、テクスチャ マップへのテクスチャ座標として使用されます。 たとえば、0,0,(D3DDECLTYPE)0,D3DDECLMETHOD_LOOKUPPRESAMPLED,Usage, UsageIndex などです。
  • ルックアップの出力は 4 floats です。
  • ディスプレイスメント マッピングは、N パッチでのみサポートされます。
  • ドライバーは、ディスプレイスメント マップを処理しない場合、SetTextureStageState の D3DDMAPSAMPLER を無視する必要があります。
  • D3DTEXF_ANISOTROPICフィルター モードはサポートされていません。
  • ディスプレイスメント マップ サンプラーでD3DSAMP_MIPFILTERがD3DTEXF_NONEされていない場合、詳細レベルは次のように計算されます (D3DRS_ENABLEADAPTIVETESSELLATIONが FALSE の場合でもアダプティブ テセレーション状態が使用されることに注意してください): Tmax = render state D3DRS_MAXTESSELLATIONLEVEL
  • 頂点 Vi に対してテセレーション レベル Te を計算する: (Xi, Yi, Zi) は、「アダプティブ テセレーション」セクションで説明されているのと同じ方法です。 詳細レベル L = log2(Tmax) - log2 (Te)。
  • テクスチャのフィルター処理とサンプリング操作は、ピクセル パイプラインと同じルールに従います (詳細レベル (LOD) バイアスが適用されるなど)。
  • すべての形式をディスプレイスメント マップとして使用できるわけではありませんが、D3DUSAGE_DMAPをサポートする形式のみを使用できます。 アプリケーションでは、CheckDeviceFormat CheckDeviceFormat を使用してクエリを実行できます。
  • このテクスチャをディスプレイスメント マップとして使用することをドライバーに通知するには、 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。
  • アダプティブ テセレーションを無効にする必要があります。
  • テクスチャ フィルターの設定は無視されます。 ポイント サンプリングが行われます。 mip テクスチャ フィルターは、D3DTEXF_NONEと見なされます。 その他のすべてのテクスチャ フィルター モードは、D3DTEXF_POINTと見なされます。
  • テクスチャ座標は、U = (Index % TextureWidthInPixeles) / (float)(TextureWidthInPixeles) V = (Index / TextureWidthInPixeles) / (float)(TextureHeightInPixeles) で、Index は生成された頂点と TSS[D3DSAMP_DMAPOFFSET] のシーケンシャル インデックスです。 シーケンシャル インデックスは、各プリミティブの開始時に 0 に設定され、頂点の生成後に増加します。

これらは、ディスプレイスメント マッピングをサポートする API の変更です。

  • 1 つのチャネル形式が追加されました。D3DFMT_L16。
  • 新しい使用フラグD3DUSAGE_DMAP。
  • ディスプレイスメント マップ テクスチャ D3DDMAPSAMPLER を設定するために使用される特殊なテクスチャ ステージ。
  • 新しいハードウェア キャップが追加され、D3DDEVCAPS2_DMAPNPATCHされ、D3DDEVCAPS2_PRESAMPLEDDMAPNPATCHされました。 D3DDEVCAPS2 を参照してください。

頂点パイプライン