以紋理表示 PRT (Direct3D 9)

DirectX SDK 中包含的 PRTDemo 範例和 PRTCmdLine 模擬器代表網格頂點的傳輸向量。 為了正確表示 PRT 訊號,這可能需要對目前遊戲而言可能不實際的鑲嵌。 代表紋理貼圖中的傳輸向量是一種替代方法,其資料成本與網格複雜度無關。 有數種方式可以使用 D3DX PRT 程式庫來產生傳輸向量紋理圖。

預先計算傳輸向量

其中一種方法是修改 PRTDemo 和 PRTCmdLine 範例,以計算介面參數化中每個紋素的傳輸向量。 若要這樣做:

  1. 修改 對 D3DXCreatePRTEngine 的呼叫,以從網格擷取紋理座標 (ExtractUV 必須是 TRUE)
  2. 使用相同的紋理大小,將 D3DXCreatePRTBuffer 呼叫取代為 D3DXCreatePRTBufferTex

除了:ComputeBounceAdaptive、ComputeSSAdaptive、ComputeSS 和 ComputeDirectLightingSHAdaptive 以外,所有 ID3DXPRTEngine 方法都適用于每一紋素模擬。 雖然紋理空間模擬會產生正確的結果,但通常相當緩慢,因為它很可能以高密度計算傳輸向量。

另一種方法是使用紋理座標 (計算自適性每個頂點 PRT 模擬) ,然後在適當的解析度) 呼叫 ID3DXPRTEngine::ResampleBuffer (使用 D3DXCreatePRTBufferTex 建立的輸出緩衝區。 這適用于 SDK 中的所有 D3DX PRT 功能,而且通常比直接計算每個材質傳輸緩衝區更有效率。

執行時間計算

如果使用單一叢集,則可以像任何其他紋理一樣篩選和 Mip 對應結果,而圖元著色器與 PRTDemo 隨附的頂點著色器程式碼相同。

如果壓縮會產生多個叢集,您無法篩選或 Mipmap 資料,因為叢集索引不是連續的。 以下是處理多叢集資料的一些替代方案:

  • 在圖元著色器中自行進行篩選。 可惜的是,基於效能考慮,這通常不可行。
  • 如果紋理是低解析度的非 Mip 對應紋理 (亦即:光線貼圖) ,則直接在紋理空間中計算光源最有效率,其中不會發生任何篩選,並以陰影紋理轉譯物件。 這基本上是完全在 GPU 上建立的動態光線對應。
  • 如果使用紋理 atlas (請參閱 使用 UVAtlas (Direct3D 9) ) ,您可以將紋理空間中連線元件中的所有傳輸向量都放在相同的叢集中,手動叢集場景。 如此一來,您可以篩選紋理,因為所有存取的紋素都會透過建構來位於相同的叢集中。 給定臉部的叢集識別碼可以從頂點著色器傳播。

圖元著色器有較少的常數暫存器無法編制索引,因此圖元著色器與頂點著色器稍有不同。 將每個叢集的工作儲存在低解析度動態紋理中,並使用紋理載入,是使用多個叢集時最有效率的方式呈現。

預先計算的弧度傳輸

PRT 示範範例

PRT 模擬器 (prtcmdline.exe)