[GDC17] Ghost Recon Wildlands:Terrain Tools and Technology
Ghost Recon Wildlands:Terrain Tools and Technology
高度圖4層
11種生態,140種材質
16km2的水域
83w棵樹,344w叢灌木,77w石頭
656公里的道路,2150公里的小路,487w貼花
90公里的鐵路,6w卧枕
58個村莊,21w的建築模塊,23w村莊裝飾物
使用了AC的引擎,x64+DX11,GPU-Driven
Houdini爸爸
高度圖使用WorldMachine
每厘米10個像素,每2厘米1個三角形 (應該是world space)
使用GPU編輯
Base一層,Macro一層,主要用來顯示大特徵,Layer在這裡相當於PS中圖層的概念,可以隨意的修改刪除,並不影響下一層
DCC層,Houdini製作
Micro層,加入沒法使用Houdini製作的細節
Material procedural的想法大概如此
根據坡度、高度、雜訊、曲率來控制
Rule像一個棧一樣從底向上計算,最後一個符合的rule保留。從截圖上看,例子中只有slope和height,以height為例,根據shader中當前點的z,smoothstep插值編輯器中artist給出當前層rule的fadeIn/Out,計算出heightBlend的值,判斷當前的rule是否保留
過渡帶不好處理
一張splatting texture(R8)保存材質的id
另一張vista texture(BC5)保存遠景LOD用的Albedo
切分成QuadTree,方便做LOD/Culling/Streaming,另外使用了Virtual Texture,這種結構更加友好
PBR材質+Displacement(ZBrush)
UBI覺得Displacement很值得花大力氣
一般遊戲使用4中material組合,GW使用了140種,所以沒法一次性全載入
選取距離玩家最近的32個materials,載入進texture array中,使用一個索引table映射global material index->local array material index,這樣來渲染前景
*後來根據真實遊戲截幀Profile,發現LUT並不是CBuffer,依然是一個texture1D
舉例說明,首先讀取R8的splat material
index,轉換為local index,接著讀取這些texture重複以上步驟3次,結果做雙線性差值,得到柔和的過度
還要考慮斜率造成的stretching,在xy兩個方向上做biplanar插值,也就是上述的過程再做2遍
效率爆炸
優化,平地和斜邊不需要blend多次
平地只做bilinear插值
這些斜邊只做biplanar
這些地方都做
Runtime的使用compute shader去劃分並且cache住。話說這性能也夠嗆。。。
*實際遊戲中,因為GPU-Driven pipeline,所以使用了VT,VT生成中根本就沒有用超過4次sample的shader
實時生成道路有點困難,離線做好又怕數據量太大,那麼直接做進地表。但是過度不好,而且缺乏細節
貼decal
性能不太行(瞧你這貼的),而且不支持displacement
VT該你上場了
缺點:需要feedback pass,數據量太大(超大地圖)
從CPU讀太慢,而且精度不夠
在GBuffer上加一個RWTexture3D,來記錄mip和uv信息
CS來處理這些信息給CPU讀,數據量很小(幾Byte)
Virtual Texture太大(10Texel per cm有點作啊)
Tiles實時生成,混合DECAL
估計218MB顯存
GPU時間
1個TD+3個TA,30個level designer使用Houdini。DCC用來創建Tools,Houdini Engine集成到Editor中,Houdini Batch計算任務
創建一個custom node來獲取terrain data(base layer)
也能獲取其他layer,macro/micro/road/railways
Houdini生成靜態物體的坐標點,返回matrix+objID
從高度圖上可以估計roughness/crest,之後用於放置rock/vegetation
從river/material/一些特殊obj可以估計wetness,之後用於影響vegetation/specular
預先計算每點的光照時間,可以預估vegetation/ambient sound
Waterflow mask可以影響terrain splatting
道路,定義路點,自動尋路
一開始自動尋路不是太好
根據論文改進
2km*2km計算10min
輸出:道路的軌跡/高度圖/splatting/橋樑
只用輸入道路,就可以自動生成decal/防撞欄/電線杆
鐵路生成類似道路,rule改變了一點:更小的陡坡/更少/角度更大的拐彎/更多的隧道/橋樑,需要把之前的道路也考慮進去,放置公路與鐵路穿插,並且保證交點盡量相互垂直。輸出:高度圖,鐵路和枕軌,隧道,橋樑
16km2都覆蓋水域,使用了一個連續的mesh,每平方公里切分一次。River/Lake可以使用rules直接生成,stream使用尋路從高山流向river。輸出:高度圖,splatting,mesh,flowmap(保存在vertex color中),wetness
村莊生成比較麻煩,輸入一個中心點和邊界curve,外加公路和鐵路,就可以輸出一堆:高度圖,splatting,建築,牆,額外的道路和小路
空地
傳統方式做rock layer,distribution
mask依賴:material/occlusion/curvature/flowmap/roughness/postfilter,distribution rules:哪個模型/slope alignment/scale/density會考慮一下不要覆蓋道路/鐵路/村莊/水域
植被
需要使用的artist自己管理創建tools,並寫用戶使用文檔
減法:所有的tools都支持curve/input exclusion(比如規定道路上沒有vegetation),這樣美術就不用關心其他人帶來的修改,比如只處理vegetation的美術可以任意的修改任何地形,即使有artist在其地形上創建了一個村莊,他只要加入exclusioin規則就可以
非同步更新:只要保證可玩性,首先會把所有物體snap到terrain上,移除road/river/railway上的vegetation等;接著檢查每個物體是否相交:橋樑/隧道會刪除石頭,石頭會刪除vegetation,電線杆沒法穿過樹木等
既然能得到所有物體的分布,就可以根據每點的密度來估算出LOD的scale factor
生成聲音
分散式計算
4個TA創建了145 tools,不只visual上的,可以生成sound,gameplay,logic
這篇非常適合TA學習,對於提升整個美術製作流程效果很好,另一方面可以看到美術冗餘而漫長的機械式工作可以換一種方式解決,從而釋放美術的設計和創造的思維。具體的tool chain和實現細節很複雜,只不過ubi沒有放在PPT上說而已,追趕真正的3A,我們還有很長的道路要走。
推薦閱讀:
※從零開始手敲次世代遊戲引擎(四十二)
※[GDC16] Assassins Creed Syndicate: London Wasnt Built in a Day
※Dirty Game Engine
※Matrix and Transform Conversion 1/3
※[GDC16] Optimizing the Graphics Pipeline with Compute
TAG:遊戲引擎 |