代表具有紋理的 PRT (Direct3D 9)
DirectX SDK 中包含的 PRTDemo 範例和 PRTCmdLine 模擬器代表網格頂點的傳輸向量。 為了準確地表示 PRT 訊號,這可能需要進行對當前遊戲而言不切實際的拼接技術。 在紋理貼圖中表示傳輸向量是一種替代方法,其數據成本與網格複雜度無關。 使用 D3DX PRT 程式庫產生傳輸向量紋理貼圖的方法有幾種。
預先計算傳送向量
其中一種方法是修改 PRTDemo 和 PRTCmdLine 範例,以計算表面參數化中每個像素的傳輸向量。 若要這樣做:
- 修改對 D3DXCreatePRTEngine 的呼叫,以從網格擷取紋理座標(ExtractUVs 必須為 TRUE)
- 使用相同的紋理大小,將 D3DXCreatePRTBuffer 呼叫取代為 D3DXCreatePRTBufferTex。
除了 ComputeBounceAdaptive、ComputeSSAdaptive、ComputeSS 和 ComputeDirectLightingSHAdaptive 以外,所有 ID3DXPRTEngine 方法都適用於每個材質的模擬運算。 雖然紋理空間模擬會產生正確的結果,但通常可能會相當緩慢,因為它很可能以高密度計算傳輸向量。
另一種方法是計算具適應性的每個頂點PRT模擬(使用將被用於每個紋素數據的紋理座標),然後呼叫 ID3DXPRTEngine::ResampleBuffer(使用 D3DXCreatePRTBufferTex 以適當的解析度建立的輸出緩衝區)。 這適用於 SDK 中的所有 D3DX PRT 功能,並且通常比直接計算每個 texel 的傳輸緩衝區更有效率。
運行時間計算
如果使用單一叢集,則可以像任何其他紋理一樣對結果進行篩選和 Mip 映射,並且圖元著色器的編程代碼與 PRTDemo 隨附的頂點著色器的編程代碼相同。
如果壓縮會產生多個叢集,您就無法篩選或Mipmap數據,因為叢集索引不是連續的。 以下是處理多重叢集數據的一些替代方案:
- 在像素著色器中自行執行所有篩選。 不幸的是,基於效能考慮,這通常不切實際。
- 如果紋理是低解析度的非 Mip 對應紋理(即:光線對應),則直接在紋理空間中直接計算光源會更有效率,且不會發生任何篩選,並以陰影紋理呈現物件。 這基本上是一個完全在 GPU(圖形處理器)上建立的動態光影圖。
- 如果使用紋理圖集(請參閱 使用 UVAtlas (Direct3D 9)),您可以通過將紋理空間中連接組件內的所有傳輸向量歸入相同的叢集,來手動叢集場景。 如此一來,您可以篩選紋理,因為所有被存取的紋素在設計上都位於同一個叢集內。 給定臉部的叢集標識碼可以從頂點著色器傳播。
圖元著色器具有無法編製索引的常數緩存器少得多,因此圖元著色器與頂點著色器稍有不同。 將每個叢集的工作儲存在低解析度動態紋理中,並使用紋理載入,是使用多個叢集時轉譯的最有效率的方式。
相關主題