大地图开发管理:《巫师3》Umbra遮挡剔除技术
本演講介紹巫師3使用Umbra實現的遮擋剔除技術。
筆記略過了一些過于平凡的實現細節,包括流的加載,如何向Umbra提交數據;也略過了一半以上關于“游戲應當如何選擇中間件”的討論。
Umbra 3
Umbra是一個芬蘭中間件公司,做出核心技術之后,于2007年成立,專注于解決3d可見性。可以看到國外的創業公司相當的小而美,公司2014年的時候只有14個雇員,居然還分到了兩個國家:在西雅圖有自己的銷售分部,面向全球銷售。最近搜了下已經有4個銷售部了。另一篇文章中提到巫師3使用Simplygon做LOD,可以發現國外有不少中間件公司,這些公司可能很小,但是相當專業。
在和各公司密切合作的過程中,Umbra會根據對方的需求(例如Bungie公司),對技術做相應演進。使用Umbra技術的產品包括:
?
- Call Of Duty-Ghost
- Destiny
- KillZone-Shadow Fall
- The Witcher 3-Wild Hunt
- Unity(按:Unity確實是使用Umbra作為中間件的。不過應該不支持動態拼合)
Wichter 3的引擎團隊與中間件選擇
Wichter2開始使用自研RED Engine,現在是第三代。巫師2加強版是2012,巫師3是2015,比前作大35倍,開發了一個復雜的流式加載系統,改造了很多美術工作流工具。引擎團隊50人左右,其中有16名左右的程序員,其他是QA和本地化人員。
選擇中間件,最主要的理由是人力限制:你永遠沒有足夠的人力來做所有細節。選擇要點:
?
- 文檔和支持
- 最好有源代碼
- 最好能為項目做定制需求
選擇和實施時的技術要點
?
- 內存管理:最好能定制分配器,以便跟蹤庫的內存使用情況
- 最好支持多線程。Umbra的烘焙和查詢都支持多線程
巫師3使用的中間件
?
- Umbra 3
- PhysX,以及其擴展插件APEX
- SpeedTree
- Wwise
- Scaleform
Umbra方:剔除數據的流式加載
Umbra是這么工作的:輸入需渲染的所有多邊形集合,稱為多邊形湯,離線預處理后生成遮擋數據卷(tome)。對數據卷進行查詢返回可見物體。他的最大優點是自動化:
?
- 不需要手工標記
- 不需要美術進行簡化,直接輸入渲染用的多邊形集合
所以對于美術和程序來說非常友好,你只需要提供直接的數據就可以了。
?
此時Witcher3的需求是:
?
- 大型開放世界,所以無法用人工方式處理。這很適合Umbra全自動流程
- 流式加載,并需要處理LOD,這個是需要解決的
流式加載
為了實現流式加載,Umbra將世界切成矩形地塊,分開烘焙,每個地塊一個數據卷。在運行期,根據攝像機的當前坐標和視距,加載局部地塊的數據卷,然后通過計算合并為一個綜合的遮擋數據卷集合,提交給渲染系統查詢。出區域的地塊可以被卸載。
對于Umbra來說,這個算法的實現難點在于:
?
- 每個塊必須獨立。即使計算遮擋數據特別是在邊界時,非常想利用其他塊的數據,也是不行的
- 邊界的匹配。鄰居塊的設置參數可能不一樣,有時候需要使用很巧妙的技巧
- 計算必須非常快,必須在幾毫秒內完成。基本上都是每幀或者隔幀查詢。
不過,在演講后有人提問的情況下,都沒有解釋任何具體算法。
?
LOD
要實現LOD,必須防止同一個物體的不同LOD將自己遮擋了。Umbra使用一個很簡單的方案,嚴格區分遮擋者與被遮擋者兩個概念,只有LOD0(即最高精度的版本)有遮擋能力,其他LOD都只能被遮擋。
Umbra查詢后直接返回LOD。每級LOD有一個激活距離,通過距離做裁剪,這樣做極大提高了查詢性能。此外,可以手工指定距離計算使用的參考點,得到更高清的LOD版本,以便處理放大鏡頭。
Umbra考慮過更復雜的策略,例如,按屏幕面積選擇LOD等級;又如,使用所有LOD的交集,而不是直接使用最精細的LOD0來計算遮擋(按:這是理論上最準確的結果,可能也會小幅加速)。但是總的來說,目前的簡化方法是足夠管用的。
流式加載的過程和效果
為了調試,提供了一個自由攝像機系統,二手手機轉讓平臺可以暫時離開主角,觀察當前的流式加載狀態。此外將流式加載的過程、內存占用、模型統計、Umbra的統計數據可視化。
32:00開始有一段移動過程視頻。其中綠色表示已加載的塊,黃色表示流式加載中的塊(加載是異步的)。
同一個城市的三種情況。第一個是典型的情況:主角在城鎮門口,第三人稱相機。只有城市前面的物體被顯示,其他被剔除。
?
最差的情況:從天空鳥瞰城市,整個城市基本都可見。
?
最好的情況,主角在小巷中,玩家只能看到非常少的建筑物。此時:
?
- 加載了43個遮擋數據塊
- 遮擋數據塊共61M,外加動態生成的數據塊間數據15M
- 62000個模型塊(Mesh Chunk)
- 500個模型塊可見
- 1.8ms查詢時間
其中模型塊是模型的子部件,如下圖綠色部分為不同的模型塊。剔除以模型塊為單位,所以可以只看見一個塔的塔尖。
?
此外,該遮擋系統通過包圍盒支持動態物體,可以剔除包括:
?
- 粒子特效
- 蒙皮mesh
- 模擬mesh(按:不知道是啥)
- 貼片,包括動態和烘焙的
數據生成
使用專門的服務器組,在每夜構建時生成全部數據。同時,可以在編輯器里面手工更新。每個地塊256*256m。烘焙時間最少幾秒,最復雜的地塊需要15~20分鐘。
實測性能
Skillige島嶼
?
- 8*8km
- 平均加載45000~50000個模型塊
- 平均可見1~5%
- Umbra數據~300M(數據+ID表)
- 40~80M內存占用
Novigard城(剛才圖片中的城市)
?
- 8.5*8.5km
- 平均加載超過100k個模型塊
- 平均可見2~5%
- Umbra數據~250M
- 45~80M內存占用
?
43:40開始展示漫游過程,推薦看一下,可以看到模型塊拆分得非常細:
?
- 視頻中房頂的兩個側面是兩個塊
- 最近處左下角房頂的正面的綠色草,就有3~4個塊,在視角移動時開關。
陰影圖目前還沒有使用剔除系統,但是理論上用起來很簡單,只需要先提交投影方向的查詢就行。物理部分也沒有使用該系統。
總結
以上是生活随笔為你收集整理的大地图开发管理:《巫师3》Umbra遮挡剔除技术的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用Unity实现传送门效果(一)
- 下一篇: 9个让2D游戏创作更轻松的工具