本演講介紹巫師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)。對資料捲進行查詢返回可見物體。他的最大優點是自動化:

不需要手工標記

不需要美術進行簡化,直接輸入渲染用的多邊形集合

所以對於美術和程式來說非常友好,你只需要提供直接的資料就可以了。

[筆記][大地圖]Solving Visibility and Streaming in the The Witcher 3: Wild Hunt with Umbra 3, GDC2014

此時Witcher3的需求是:

大型開放世界,所以無法用人工方式處理。這很適合Umbra全自動流程

流式載入,並需要處理LOD,這個是需要解決的

流式載入

為了實現流式載入,Umbra 將世界切成矩形地塊,分開烘焙,每個地塊一個

資料卷

。在執行期,根據攝像機的當前座標和視距,載入區域性地塊的

資料卷

,然後透過計算合併為一個綜合的遮擋資料卷集合,提交給渲染系統查詢。出區域的地塊可以被解除安裝。

對於 Umbra 來說,這個演算法的實現難點在於:

每個塊必須獨立。即使計算遮擋資料特別是在邊界時,非常想利用其他塊的資料,也是不行的

邊界的匹配。鄰居塊的設定引數可能不一樣,有時候需要使用很巧妙的技巧

計算必須非常快,必須在幾毫秒內完成。基本上都是每幀或者隔幀查詢。

不過,在演講後有人提問的情況下,都沒有解釋任何具體演算法。

[筆記][大地圖]Solving Visibility and Streaming in the The Witcher 3: Wild Hunt with Umbra 3, GDC2014

左圖:預處理的分塊。右圖:根據攝像機視野判斷的需載入資料塊

LOD

要實現LOD,必須防止同一個物體的不同LOD將自己遮擋了。Umbra使用一個很簡單的方案,嚴格區分遮擋者與被遮擋者兩個概念,只有LOD0(即最高精度的版本)有遮擋能力,其他LOD都只能被遮擋。

Umbra查詢後直接返回LOD。 每級LOD有一個啟用距離,透過距離做裁剪,這樣做極大提高了查詢效能。此外,可以手工指定距離計算使用的參考點,得到更高畫質的LOD版本,以便處理放大鏡頭。

Umbra考慮過更復雜的策略,例如,按螢幕面積選擇LOD等級;又如,使用所有LOD的交集,而不是直接使用最精細的LOD0來計算遮擋(按:這是理論上最準確的結果,可能也會小幅加速)。但是總的來說,目前的簡化方法是足夠管用的。

流式載入的過程和效果

為了除錯,提供了一個自由攝像機系統,可以暫時離開主角,觀察當前的流式載入狀態。此外將流式載入的過程、記憶體佔用、模型統計、Umbra的統計資料視覺化。

32:00 開始有一段移動過程影片。其中綠色表示已載入的塊,黃色表示流式載入中的塊(載入是非同步的)。

[筆記][大地圖]Solving Visibility and Streaming in the The Witcher 3: Wild Hunt with Umbra 3, GDC2014

[筆記][大地圖]Solving Visibility and Streaming in the The Witcher 3: Wild Hunt with Umbra 3, GDC2014

同一個城市的三種情況。第一個是典型的情況:主角在城鎮門口,第三人稱相機。只有城市前面的物體被顯示,其他被剔除。

[筆記][大地圖]Solving Visibility and Streaming in the The Witcher 3: Wild Hunt with Umbra 3, GDC2014

最差的情況:從天空鳥瞰城市,整個城市基本都可見。

[筆記][大地圖]Solving Visibility and Streaming in the The Witcher 3: Wild Hunt with Umbra 3, GDC2014

最好的情況,主角在小巷中,玩家只能看到非常少的建築物。此時:

載入了43個

遮擋資料塊

遮擋資料塊

共 61M,外加動態生成的資料塊間資料15M

62000 個模型塊 (Mesh Chunk)

500 個模型塊可見

1。8ms 查詢時間

其中

模型塊

是模型的子部件,如下圖綠色部分為不同的模型塊。剔除以模型塊為單位,所以可以只看見一個塔的塔尖。

[筆記][大地圖]Solving Visibility and Streaming in the The Witcher 3: Wild Hunt with Umbra 3, GDC2014

此外,該遮擋系統透過包圍盒支援動態物體,可以剔除包括:

粒子特效

蒙皮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記憶體佔用

[筆記][大地圖]Solving Visibility and Streaming in the The Witcher 3: Wild Hunt with Umbra 3, GDC2014

43:40開始展示漫遊過程,推薦看一下,可以看到模型塊拆分得非常細:

影片中房頂的兩個側面是兩個塊

最近處左下角房頂的正面的綠色草,就有3~4個塊,在視角移動時開關。

陰影圖目前還沒有使用剔除系統,但是理論上用起來很簡單,只需要先提交投影方向的查詢就行。物理部分也沒有使用該系統。