テクスチャを使用した PRT の表現 (Direct3D 9)

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

転送ベクトルの事前計算

1 つの方法は、PRTDemo サンプルと PRTCmdLine サンプルを変更して、サーフェスのパラメーター化ですべてのテクセルで転送ベクトルを計算することです。 これを行うには、次の手順を実行します。

  1. D3DXCreatePRTEngine の呼び出しを変更してメッシュからテクスチャ座標を抽出します (ExtractUV は TRUE である必要があります)
  2. 同じテクスチャ サイズを使用して 、D3DXCreatePRTBuffer 呼び出しを D3DXCreatePRTBufferTex に置き換えます。

すべての ID3DXPRTEngine メソッドは、ComputeBounceAdaptive、ComputeSSAdaptive、ComputeSS、ComputeDirectLightingSHAdaptive を除き、テクセル単位のシミュレーションで動作します。 テクスチャ空間シミュレーションでは正しい結果が生成されますが、多くの場合、転送ベクトルを高密度で計算するため、かなり遅くなる可能性があります。

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

ランタイム計算

1 つのクラスターが使用されている場合、他のテクスチャと同様に結果をフィルター処理して mip マップすることができ、ピクセル シェーダーは PRTDemo に付属する頂点シェーダー コードと同じです。

圧縮によって複数のクラスターが生成される場合、クラスタリング インデックスは連続していないため、データをフィルター処理またはミップマップすることはできません。 複数クラスター化されたデータを処理するための代替手段を次に示します。

  • ピクセル シェーダーですべてのフィルター処理を自分で行います。 残念ながら、これは一般的にパフォーマンス上の理由から実用的ではありません。
  • テクスチャが低解像度の非 mip マップテクスチャ (ライト マップ) である場合は、テクスチャ空間で直接照明を計算するだけで、フィルター処理が行われず、シェーディングされたテクスチャでオブジェクトをレンダリングする方が効率的である可能性が最も高くなります。 これは基本的に、GPU 上に完全に作成される動的なライト マップです。
  • テクスチャ アトラスが使用されている場合 ( 「UVAtlas の使用 (Direct3D 9)」を参照)、テクスチャ空間内の接続されたコンポーネント内のすべての転送ベクトルを同じクラスター内に配置することで、シーンを手動でクラスター化できます。 このようにすると、アクセスされるすべてのテクセルが構築によって同じクラスター内にあるため、テクスチャをフィルター処理できます。 特定の顔のクラスター ID を頂点シェーダーから伝達できます。

ピクセル シェーダーではインデックスを作成できない定数レジスタがはるかに少ないため、ピクセル シェーダーは頂点シェーダーとは多少異なります。 クラスターごとの作業を低解像度の動的テクスチャに格納し、テクスチャの読み込みを使用すると、複数のクラスターを使用するときにレンダリングする最も効率的な方法になります。

事前計算済みの放射転送

PRT デモ サンプル

PRT シミュレーター (prtcmdline.exe)