靜態合批,動態合批,GPU Instancing
阿新 • • 發佈:2022-03-27
合批
前提:材質必須相同
目的:合批是節省了CPU的相關準備工作的工作量(CPU傳遞資料給GPU的次數, drawcall)
離線合批
利用美術工具例如Maya把相關資源做合批處理,以減輕引擎實時合批的負擔。
比如靜態模型和場景物件。如場景地表裝飾面:石頭/磚塊等等
實時合批
- 靜態合批:對標記為static的Mesh自動合批。以空間換時間的策略來提升渲染效率。以儲存更多網格資料為代價的
- 動態合批:將數份Mesh的資料複製貼上到一起,也就是實時的,每一幀都合併,但不適用於網格資料太多的物體(比如球)
- GPU Instancing:讓GPU一次性渲染同一網格多次,每次繪製的網格屬性都可以不一樣:包括縮放、位置、顏色等等,即材質球雖然相同但屬性可以各有各的區別。使用一個渲染呼叫來繪製多個物體,來節省每次繪製物體時CPU -> GPU的通訊。
為什麼有GPU Instancing?
即便渲染頂點非常快,命令GPU去渲染卻未必,而且大量的頂點頂點著色器MVP變換等壓力也很大。如果我們能夠將變換處理好的資料一次性發送給GPU,然後使用一個繪製函式讓OpenGL利用這些資料繪製多個物體。
優點:沒有動態合批那樣對網格數量的限制,也沒有靜態網格那樣需要這麼大的記憶體
動態合批與靜態合批的區別:
- 動態合批不會建立常駐記憶體的“合併後網格”,也就是說它不會在執行時造成記憶體的顯著增長,也不會影響打包時的包體大小;
- 動態合批在繪製前會先將頂點轉換到世界座標系下,然後再填充進頂點、索引緩衝區;靜態合批後子網格不接受任何變換操作,僅手動合批後的Root節點可被操作,因此靜態合批的頂點、索引緩衝區中的資訊不會被修改(Root的變換資訊則會通過Constant Buffer傳入);
- 因為2的原因,動態合批的主要開銷在於遍歷頂點進行空間變換時的對CPU效能的開銷;靜態合批沒有這個操作,所以也沒有這個開銷;
- 動態合批使用根據渲染器型別分配的公共緩衝區,而靜態合批使用自己專用的緩衝區。
Reference
- https://blog.csdn.net/chenweiyu11962/article/details/121340711