2009-11-20 54 views
1

我有一個運行的3D引擎內置在D3D(通過SlimDX)。爲了避免中斷渲染管道,我將具有相同材質的多個對象組合成更大的網格(以減少狀態切換)。這工作得很好,併爲我的需要提供了良好的性能水平。D3D性能比較,着色器vs內置陰影

我遇到的問題是我在運行期間需要更改這些較大批量網格的某些子集上的材料屬性。我正在使用屬性緩衝區,它一直工作得很好。我之前一直在使用有限數量的活動屬性(每個網格約5個),但現在發現需要在材質(不透明度/色彩搭配的不同色調)上有更多變化,因此可能會有數百個或更多的組合。而且由於這些更改在運行時發生,我無法在渲染開始之前將它們捆綁在一起。當然,我可以重新構建網格,但我寧願不要,因爲它速度很慢,並且材料之間的切換需要以交互速度完成。

所以我的問題是,最好的路線是什麼?

  • 我應該實行動態口罩隨叫隨到屬性ID面臨着一個更強大的屬性處理系統,然後完成時對它們進行復位?我聽說屬性緩衝區中的碎片會產生額外的性能影響,並且我也不確定後續DrawSubset()調用與之間的材質切換(即何時過多以及何時應優化屬性數組?)的性能影響。任何有此經驗的人?

  • 我的另一個想法是使用參數化像素着色器。我不需要任何奇特的效果,只是最低限度的(當前是內置的平面着色器,只有顏色和一些對象的透明度),所以着色器模型1已經足夠滿足我的需求。這裏的想法是使用一個通用着色器,而不是在調用之間切換材質,只是改變一些着色器參數。但是我不知道這是否比切換材質更快,或者如果可編程着色器比構建時更慢(給出相同的結果)。

我也好奇切換目或在一個大的網格繪製不同子集(給定相同數量的材料開關,用於這兩種情況下)之間的性能命中的差異。

我知道這些問題可能會在GFX卡和它們各自的性能/年齡之間有所不同,但我只是在這裏尋找關於什麼是最關注的一般指南(即什麼類型的狀態切換/ CPU干擾這給了最大的GPU命中)。內存也是一個問題,所以任何複製整個(或大部分)網格的實現對我來說都是不可能的。

我的注意力集中在較老的(5y)/功能較弱/集成的GFX卡上,而不一定是頂級的遊戲卡或工作站卡(如Quadro)。我猜想使用着色器可以製作或破解解決方案,具體取決於特定電路板上着色器的性能。

任何和所有的建議和反饋,非常感謝。

非常感謝提前!

回答

3

改變着色器參數將會很慢。理想情況下,您希望編寫基於Shader 2的着色器,將大部分屬性緩衝區上載到圖形卡。然後你有一個per-vertex屬性字段可以選擇適當的屬性緩衝區。

您的表現問題將來自您使用的繪圖調用次數。越多的抽獎電話使用越多的性能受到影響。對着色器常量或紋理的任何更改都需要新的DIP調用。你想要做的就是儘量減少着色器常量修改的數量和DIP調用的數量。

它成爲一個相當複雜的過程思想。

例如,如果您正在處理一個骨骼模型,其中有64個骨骼,那麼您有2個選項。 1爲每個骨骼的網格數據設置世界矩陣並調用DIP。或者,您可以一次加載儘可能多的骨骼矩陣,並在頂點上使用一個值來選擇要使用的骨骼,並調用DIP一次。第二個會更快。你可能會發現你可以很容易地以這種方式做一些基於多骨的蒙皮。

這適用於導致着色器不斷變化的任何事情。請注意,即使您可能使用固定功能管道,但大多數現代圖形硬件(即自2002年發佈Radeon 9700以來的任何圖形硬件)都會將固定功能轉換爲基於着色器,因此應用相同的性能問題。

基本上,避免任何事情的東西都是導致您進行另一次DIP撥號的任何事情。很顯然,爲了避免這樣做而做到這一點是不切實際的,而且某些變化的成本較低。作爲一個粗略的經驗規則,按照費用順序,要避免的事情如下:(被警告已經有一段時間了,因爲我測試了這個,所以你可能想對這個主題做一些測試和替代讀數)

1)改變着色
2)改變紋理
3)改變着色恆定
4)改變頂點緩存
5)改變索引緩衝區

1是迄今爲止最昂貴的。

與其餘的相比,4和5相當便宜,但是不同的頂點格式可能會導致更大的問題,因爲它可能會導致着色器被更改。

編輯:我不完全確定爲什麼改變常量傷害如此之多。我原以爲這樣的改變會順利進行。也許在現代硬件上它不是這樣的問題。在一些早期的硬件上,常量被編譯到着色器中,所以改變常量會導致着色器發生完全變化。

與任何你最好的嘗試,看看會發生什麼。

排序所有呼叫的一個有趣的解決方案可以使用排序鍵,其中前8位給你一個着色器ID。接下來的10位紋理等等。然後,您執行正常的數字排序,並且您可以使用不同的排序順序輕鬆地播放,以查看提供最佳性能的東西:)

Edit2:值得注意的是,任何改變像素着色器狀態的變化都會比改變頂點緩衝區狀態,因爲它在管道中更深。因此它需要更長的時間才能通過...

+0

好點。正如你所說,改變着色器常量強制一個新的DIP(從我猜測下面的DrawSubset)。在設置默認着色器和在默認着色器上設置漫反射顏色時,性能損失差異是什麼?或者有沒有?爲什麼頂點/索引緩衝區切換更快?是否因爲改變材質選項「斷開」管道並影響渲染後端的更多狀態更改?在哪裏我可以找到這些時間匯的大約比率(或者它在製造商和型號之間變化太大)? – Burre 2009-11-23 09:42:55