我有一個運行的3D引擎內置在D3D(通過SlimDX)。爲了避免中斷渲染管道,我將具有相同材質的多個對象組合成更大的網格(以減少狀態切換)。這工作得很好,併爲我的需要提供了良好的性能水平。D3D性能比較,着色器vs內置陰影
我遇到的問題是我在運行期間需要更改這些較大批量網格的某些子集上的材料屬性。我正在使用屬性緩衝區,它一直工作得很好。我之前一直在使用有限數量的活動屬性(每個網格約5個),但現在發現需要在材質(不透明度/色彩搭配的不同色調)上有更多變化,因此可能會有數百個或更多的組合。而且由於這些更改在運行時發生,我無法在渲染開始之前將它們捆綁在一起。當然,我可以重新構建網格,但我寧願不要,因爲它速度很慢,並且材料之間的切換需要以交互速度完成。
所以我的問題是,最好的路線是什麼?
我應該實行動態口罩隨叫隨到屬性ID面臨着一個更強大的屬性處理系統,然後完成時對它們進行復位?我聽說屬性緩衝區中的碎片會產生額外的性能影響,並且我也不確定後續DrawSubset()調用與之間的材質切換(即何時過多以及何時應優化屬性數組?)的性能影響。任何有此經驗的人?
我的另一個想法是使用參數化像素着色器。我不需要任何奇特的效果,只是最低限度的(當前是內置的平面着色器,只有顏色和一些對象的透明度),所以着色器模型1已經足夠滿足我的需求。這裏的想法是使用一個通用着色器,而不是在調用之間切換材質,只是改變一些着色器參數。但是我不知道這是否比切換材質更快,或者如果可編程着色器比構建時更慢(給出相同的結果)。
我也好奇切換目或在一個大的網格繪製不同子集(給定相同數量的材料開關,用於這兩種情況下)之間的性能命中的差異。
我知道這些問題可能會在GFX卡和它們各自的性能/年齡之間有所不同,但我只是在這裏尋找關於什麼是最關注的一般指南(即什麼類型的狀態切換/ CPU干擾這給了最大的GPU命中)。內存也是一個問題,所以任何複製整個(或大部分)網格的實現對我來說都是不可能的。
我的注意力集中在較老的(5y)/功能較弱/集成的GFX卡上,而不一定是頂級的遊戲卡或工作站卡(如Quadro)。我猜想使用着色器可以製作或破解解決方案,具體取決於特定電路板上着色器的性能。
任何和所有的建議和反饋,非常感謝。
非常感謝提前!
好點。正如你所說,改變着色器常量強制一個新的DIP(從我猜測下面的DrawSubset)。在設置默認着色器和在默認着色器上設置漫反射顏色時,性能損失差異是什麼?或者有沒有?爲什麼頂點/索引緩衝區切換更快?是否因爲改變材質選項「斷開」管道並影響渲染後端的更多狀態更改?在哪裏我可以找到這些時間匯的大約比率(或者它在製造商和型號之間變化太大)? – Burre 2009-11-23 09:42:55