Share via


テクスチャーによる RPT の表現 (Direct3D 9)

DirectX SDK に含まれる PRTDemo サンプルと PRTCmdLine シミュレーターは、メッシュの頂点の転送ベクトルを表します。PRT 信号を正確に表現するには、現在のゲームには現実的ではないこともあるテッセレーションが必要となります。テクスチャー マップ内での転送ベクトルの表現は、メッシュの複雑さとは関係のない同じデータ コストの代替アプローチです。D3DX PRT ライブラリを使用して転送ベクトル テクスチャー マップを生成する方法はいくつかあります。

転送ベクトルの事前計算

その 1 つに、PRTDemo サンプルと PRTCmdLine サンプルを変更してサーフェスのパラメーター化の各テクセルで転送ベクトルを計算するという方法があります。次の手順で操作します。

  1. メッシュからテクスチャー座標を抽出するように D3DXCreatePRTEngine の呼び出しを変更します (ExtractUVs は TRUE でなければなりません)。
  2. 同じテクスチャー サイズを使用して D3DXCreatePRTBuffer 呼び出しを D3DXCreatePRTBufferTex と置き換えます。

D3DXPRTEngine のメソッドは、ComputeBounceAdaptive、ComputeSSAdaptive、ComputeSS、および ComputeDirectLightingSHAdaptive を除き、すべてテクセルごとのシミュレーションを処理します。テクスチャー空間のシミュレーションは正確な結果を生成しますが、高い密度で転送ベクトルを計算する可能性が高いために、処理速度がかなり遅くなることが少なくありません。

もう 1 つの方法は、適応型の頂点ごとの PRT シミュレーションを計算し (テクセルごとのデータに使用されるテクスチャー座標を使用)、ID3DXPRTEngine::ResampleBuffer を呼び出す (適切な解像度で D3DXCreatePRTBufferTex を使用して作成される出力バッファーを使用) というものです。これは、SDK 内のすべての D3DX PRT 機能とともに動作し、多くの場合テクセルごとの転送バッファーを直接計算するよりもはるかに効率的です。

ランタイムの計算

単一のクラスターが使用されている場合、他のテクスチャーのように結果をフィルターしてミップマップできます。また、ピクセル シェーダーは PRTDemo に付属する頂点シェーダー コードとまったく同じです。

圧縮によって複数のクラスターが生成される場合、クラスターのインデックスは連続的ではないため、データをフィルターまたはミップマップすることはできません。マルチクラスター データを処理するその他の方法をいくつか示します。

  • ピクセル シェーダーでフィルター処理をすべて自身で行います。残念ながら、パフォーマンス上の理由から通常は現実的ではありません。
  • テクスチャーが低解像度のミップマップされていないテクスチャー (ライト マップ) の場合、テクチャー空間でライティングを直接計算するほうが、通常、より効率的です。この場合、フィルター処理は行わず、シェーディングされたテクスチャーでオブジェクトをレンダリングします。これは本質的には GPU でまるごと作成される動的なライト マップです。
  • テクスチャー アトラスが使用される場合 (「UVAtlas の使用 (Direct3D 9)」を参照)、テクスチャー空間内の接続されているコンポーネント内のすべての転送ベクトルを同じクラスター内にすることによって、手動でシーンをクラスター処理できます。このように、構成上、アクセスされるすべてのテクセルが同じクラスター内になるため、テクスチャーをフィルターできます。指定された面のクラスター ID は頂点シェーダーから送信できます。

ピクセル シェーダーでは、インデックスを付けることができない定数レジスタははるかに少ないため、ピクセル シェーダーは頂点シェーダーとは多少異なります。クラスターごとの保存は低解像度の動的テクスチャーで動作するため、複数のクラスターを使用する場合にはテクスチャー ロードの使用が最も効率的なレンダリング方法となります。

関連項目

PRTDemo サンプル」、PRT シミュレーター (prtcmdline.exe)