Draw Call Batch與亂序光柵化
MSDN / Direct3D 9 / Accurately Profiling Direct3D API Calls
https://docs.microsoft.com/en-us/windows/desktop/direct3d9/accurately-profiling-direct3d-api-calls
一般認為Draw Call Batch是為了解決CPU瓶頸,MSDN上的Direct3D9文檔中對此進行了相關的討論。
但實際上,Draw Call Batch還可以提高GPU繪制三角形時的并行度,還可以在某種程度上解決GPU瓶頸。
我們知道GPU在本質上是一個并行的系統,比如,“不同Fragment Shader之間不具有任何依賴”可以認為是GPU并行性的一個典型代表;但是由于應用層的某些邏輯的需要,導致了GPU在一定程度上具有串行性。
比如,經典的繪制透明物體的算法需要在應用層將物體從前到后或從后到前排序,并依次調用Draw Call,這意味著“在結果上”GPU繪制三角形的順序應當與應用層調用Draw Call的順序一致。
這意味著應用層按順序調用Draw Call其實隱含著某種依賴關系。
我們之所以強調“在結果上”是因為:在實際實現中,GPU仍并行地繪制三角形,只不過在輸出結果前進行了相關的處理來保證Draw Call靠后的三角形一定覆蓋Draw Call靠前的三角形。
"Real Time Rendering Fourth Edition Chapter 23 Graphics Hardware Section 9 Architecture"中對GPU處理三角形時所進行的排序進行了詳細的討論。
顯然同一個Draw Call中的三角形不需要排序(應用層的邏輯不關心它們的繪制順序),因此Draw Call Batch可以提高GPU的并行度,從而可以在某種程度上解決GPU瓶頸。
Matthaeus Chajdas. "Unlock the Rasterizer with Out-of-Order Rasterization." AMD GPUOpen 2016.
https://gpuopen.com/unlock-the-rasterizer-with-out-of-order-rasterization/
AMD最近給出了一個亂序光柵化的Vulkan擴展,試圖通過摒棄排序來提升GPU的并行度。
//PS:AMD的亂序光柵化擴展說明了OIT(順序無關透明)算法的重要性,是時候啟用一波OIT算法了(http://research.nvidia.com/publication/phenomenological-scattering-model-order-independent-transparency)233333333
但是,通過摒棄排序來提升GPU并行度的方式貌似只適用于Sort-Last Fragment架構的PC平臺的GPU;Sort-Middle Tiled架構的Mobile平臺的GPU在Fragment Shader之前進行排序,并通過FPK(Forward Pixel Kill)的方式對Fragment Shader的執行次數進行優化,想要摒棄排序貌似是不大可能的。
本文轉載自異步社區
軟件開發 軟件開發
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。