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

2021-10-06 22:13:15 字數 1027 閱讀 5884

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

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

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

請見下圖:

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

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

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

大規模地形渲染

地形在計算機圖形學中是一種比較特殊的物體 通常地形被設計為規則的網格 網格上每個頂點都根據不同的高度在網格的法線量方向進行位移 地形的高度被儲存為乙個名為高度圖的檔案中 當地形的網格結構越密集 地形的外觀就顯得越平滑 但同時也增加了需要被渲染的頂點和三角形數量 怎麼才能在保證地形的外觀平滑的前提下儘...

Unity 大規模魚群的渲染

看了gdc關於abzu的演講,感覺很受啟發,決定在unity中實現其中講到的魚群的渲染。首先是乙個基礎的shader,這裡我寫了乙個支援主貼圖和法線貼圖的只有漫反射的shader 大概就是這樣 shader fishtest fishshader noscaleoffset normalmap no...

大規模並行查詢引擎 BlinkDB

blinkdb 是乙個用於在海量資料上執行互動式 sql 查詢的大規模並行查詢引擎。它允許使用者通過權衡資料精度來提公升查詢響應時間,其資料的精度被控制在允許的誤差範圍內。為了達到這個目標,blinkdb 使用兩個核心思想 我們已經使用了 tpc h 基準測試來評估 blinkdb 的效能,實際分析...