[筆記][大地圖]Solving Visibility and Streaming in the The Witcher 3: Wild Hunt with Umbra 3, GDC2014
本演講介紹巫師3使用Umbra實現的遮擋剔除技術。
筆記略過了一些過於平凡的實現細節,包括流的載入,如何向Umbra提交資料;也略過了一半以上關於“遊戲應當如何選擇中介軟體”的討論。
演講時巫師3還未面市。
影片:
https://www。
gdcvault。com/play/10206
86/Solving-Visibility-and-Streaming-in
PPT:
https://www。
gdcvault。com/play/10202
31/Solving-Visibility-and-Streaming-in
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個塊,在視角移動時開關。
陰影圖目前還沒有使用剔除系統,但是理論上用起來很簡單,只需要先提交投影方向的查詢就行。物理部分也沒有使用該系統。