大規模實時渲染引擎子系統之動態遮擋剔除子系統

實時渲染引擎在面對大規模渲染對象(drawCall數量很多,例如2w以上)的時候, 性能損耗在drawcall的地方就會很大,在移動端和web端表現尤爲明顯。除了合批繪製( 無論是cpu或者是gpu端)等優化之外,動態的遮擋剔除系統提供的支持是一個有效的減少drawcall次數的機制。

這裏主要說的是動態遮擋剔除,這種剔除機制主要是幾何運算(本身運算消耗少,還可以藉助其他線程來提供算力),在進入渲染器階段之前就儘可能的剔除沒必要渲染的對象。很多輔助設計或者遊戲(例如室內或者第一視角遊戲),因爲有很多實際存在的遮擋對象,所以遮擋剔除在這些環境中就很有效。

基於幾何計算的遮擋剔除,原理是利用開放或者封閉的空間包圍體(球體,六面體等)對需要做剔除測試對象做的集合做布爾運算(可見或者不可見),正因爲有布爾運算,所以各種包圍體可以通過布爾運算做求交,求差,求和等集合運算, 可以通用的測試遮擋體之間的遮擋關係,結合空間管理機制,可以獲得很高的運行時性能表現。

請見下圖:

有了遮擋剔除,可以剔除掉很多不必要的drawCall(下面的圖如果全部drawcall原本有10090個單次drawcall)

通過上圖的演示可以看到,這種遮擋剔除,避免了90%左右的多餘drawcall。在有需求的場合還是非常有效的。

實際上遮擋剔除系統,不僅僅能優化直接的渲染邏輯,還可以優化例如實時燈光計算、實時陰影渲染等渲染消耗。除了渲染,還可以優化例如鼠標拾取測試,運動碰撞檢測(例如運動掃掠體)等。結合現代的多核多線程,可以在模型面熟精度高,渲染單元量巨大,要求高效能這種應用中發揮很不錯的功效。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章