找回密碼
 注冊帳號

掃一掃,訪問微社區

游戲新聞 《荒野大鏢客2》的大氣云霧技術

1
回復
133
查看
打印 上一主題 下一主題
[ 復制鏈接 ]
排名
1
昨日變化

2362

主題

2993

帖子

1萬

積分

Rank: 16

UID
1
好友
26
蠻牛幣
10711
威望
10
注冊時間
2013-5-14
在線時間
3739 小時
最后登錄
2020-4-28

一貧如洗游戲蠻牛QQ群會員活力之星

馬上注冊,結交更多好友,享用更多功能,讓你輕松玩轉社區。

您需要 登錄 才可以下載或查看,沒有帳號?注冊帳號

x
作者:安柏霖 騰訊互動娛樂 工程師


技術一直行業領先,但是一直低調的Rockstar,終于在SIGGRAPH 2019放了大,做了《荒野大鏢客2》(大表哥2,Red Dead: Redemption II)中的大氣云霧技術分享。

看得也是近幾年最過癮的一篇了,high點:

  • 是發售游戲中實際使用的、完整的、系統化的技術合集
  • 代表當前最強的大氣系統
  • 技術探索&整合nice,積累深厚,運用純熟
  • 理論、實際開發已經性能優化有很好的平衡,堪稱R&D的典范


motivation & overview

這也是很多優秀工作室做事的一個方法,在處理開創性事情的時候,就會列出一些依據來進行“合理突破”。

這里筆者也是深有共鳴,是一個很有章法的做事方式。

Rockstar這里就包括:


  • 在《荒野大鏢客1》中已經有了不錯的大氣系統,而且這個確實很重要,當然要在2中進一步發展。
  • 受到一些名畫的啟發,筆者也是在看一些繪畫,去一些景色壯觀的地方都會帶來很強的創作沖動(雖然我是寫程序)。
  • 以及基礎的atmosphere scattering系統中,現在確實還有很多可以完善的地方。


通篇是分成data model、render、scene integration三個部分。

data model



這部分是一個知難行易的模塊,所以直接列下特性和做法。

  • 云的分布


這塊比較類似Horizon Zero Dawn的做法:

https://blog.csdn.net/toughbro/article/details/48844649


使用分布圖來定義云的整體分布:

[ 出來效果這樣的,同時可以有多層的云 ]

  • 霧的分布


類似云的分布,霧也是有一個分布:

[ 沒有fog map的版本 ]

[ 有fogmap的版本 ]

  • 云的形狀定義


這塊參考的15年的Horizon Zero Dawn的做法:

https://blog.csdn.net/toughbro/article/details/48844649

基本原理差不多,有一些自己的特色:


這里定義云的形狀:

  • 1個lut定義云的厚度
  • 1x3d noise,2x displacement


效果目測要比Horizon Zero Dawn的好一些。

render

接下來我們看第二部分,這部分主要談渲染部分,包括scattering和lighting的render,相對內容也多一些。

可以說這部分是本篇重點所在。


  • voxel+raymarching



處理大氣效果時候,為了兼顧近處的精度和場景的宏大,使用了混合方案:

  • 近處使用voxelization的方式,得到高精度的渲染結果,reference了刺客信條的一個文章:


https://blog.csdn.net/toughbro/article/details/46706837

  • 遠處使用rayMarching的方式,平衡效果和效率


光照模型



這里最終的光照模型,使用這樣的公式列出來,這個比較像大家所熟悉的PhysicallyBasedLighting中的macrofacet公式的模樣,其中三項如下:

  • P:phase的縮寫,是光通過media時候的scattering的情況
  • V:visibility,我們可以近似理解成shadow類的東西
  • L:lighting,也就是光源,直接光,ambient lighting等等


  • phase項




這里分成兩個層級:

1、基礎phase模型,是基于Henyey-Greenstein phase function(簡稱HG),這個模型對于single forward scattering處理的比較好。

2、多種scattering組合,基于上面的擅長處理single forward scattering的HG(heney-greenstein)模型。

3、==使用多級HG模型來模擬multi scattering

4、==使用一個clamp操作來模擬back scattering

這里稍微貼下HG模型的樣子:


這里g項是[-1,1]之間,代表從back scattering到forward scattering的情況,表示media的屬性。

theta就是各個角度,phase function就是關于角度的函數么。

HG函數這部分還是比較物理的,但是multi scattering部分就是比較變通了,是多級HG來模擬multi scattering,各級之間的權重由美術定義。

然后給定g,關于theta就可以預計算出來,放到LUT(look up tabble)貼圖中:


最后放在一起的效果:

只有1級HG function的時候:


2級HG function模擬multi scattering+back scattering:


  • “physically based"的度和變通


這里也是涉及到一個“physically based"的程度問題,原則上我們是要physically based這樣會盡可能的物理化,好處現在PBR已經論證的非常好了。

但是實際開發中,我們會遇到各種需要折中的地方,或許是物理模型不夠好,或許計算過重等等。

這時候,none-physically-based就還是需要了,這時候建議是,盡可能在高層去做hack和變通,保持底層原子項部分的“physically based"正如phase function這里,底層是HG function,高層是美術來指定的函數。

  • visibility項




這一項就是光照信息中間被遮擋的情況,和直接光照有點不一樣的是,由于這個是一個scattering的過程,所以完整來講是光線一路射過來中間每一步的visibility情況的疊加。


落實到實際計算中,就是ray marching中間每一步的visibility情況的疊加。

這里visibility主要針對影響大的兩個case:terrain、cloud來做計算。

terrain使用raymarching的方式構建一個shadowmap信息;

cloud使用exponential shadow map的方式,來encode shadow map信息,來達到非常軟陰影的信息,一共存了6mips(esm的使用在刺客信條的文章里也有)。

  • lighting項



ambient lighting部分:

  • 遠處的ray marching部分,就是sky ambient,把sky scattering存到低精度的paraboloid貼圖里面
  • 近處的frustum voxelization部分,sky light+light probe lighting*AO



local light 部分,直接就讀light cluster volume。


  • froxel


froxel也是技術創造的名詞:這個的縮寫frustum voxel;


也是用voxel的形式,存儲低精度的場景volume信息,然后用于低頻信息渲染,比如scattering;

《荒野大鏢客2》中的存了三種信息:

  • shadow
  • material
  • lighting (結合前兩者來計算)



shadow volume,注意這個不是陰影算法的shadow volume,就是存放shadow的volume信息,包括了普通shadow和cloud shadow;

中間使用了temperal filtering來處理穩定的問題;


material volume,各種材質信息,也帶上了wind交互等等(讓我想起了戰神的風力存在volume中)。

也有temperal filter。

  • ray marching



可能有的讀者對ray marching還不是特別熟悉,ray marching特別常用于volume類的渲染中,鑒于一些計算硬件和數據的限制,有些情況難以很容易的使用ray trace的方式尋找交點,比如local reflection中要對depth buffer找交點。那么就用步進的方式來找交點,這種方法就是ray marching;這里的步長的選擇是應用ray marching的時候需要具體斟酌的地方。


回到《荒野大鏢客2》,ray marching的步長策略選擇也是頗費心思:

  • 考慮到場景深度、ground plane、cloud dome
  • 另外要仔細考慮到云層的厚度信息


即便這樣也很容易跳過比較薄的云層。

  • ray marching優化


先看下最終的性能


可以看到ray march是占據著性能的大頭,而且這還是經過優化過之后的結果。

這里優化就基于兩個大的策略:low resolution + temperal,也就是在低分辨率上做raymarch計算,然后通過多幀來重建。

這個部分很精彩,我們多展開。


這里raymarch的起點是在froxel的末端,帶上blue noise(可以理解成一個頻率較高的noise了,感興趣可查下)做偏移。

半分辨率大小,然后分4幀來計算。

  • raymarch reconstruct



由于是分4幀來構建,所以每幀只能raymarch 2x2 像素中的一個,另外三個就要從history buffer中拿。

這里用了temperal相關的很多做法,一些在taa中頗為常見。

1、使用了3x3像素color aabb clamp的方式

2、大的深度斷裂的地方,臨接像素就不考慮了

3、在深度斷裂(depth discrepancies)的地方,放更多的ray

這里能正確的判定出來depth discrepancy還是比較棘手的,要做的事情就是在6x6(2x2 ray, 3x3 neighbouhood, 所以一共6x6)像素中,正確的識別depth的min/max;

嘗試1,uniform分布


可以看到在frame2里面,min/max就錯了,這個會導致誤判。

嘗試2,checkerboard方式

能處理的case好很多:


但是這種情況下還是不行:


總之局部的分布策略總是有cover不住的情況了,還是要引入整體的信息才行。

嘗試3:checker board+depth neighborhood analysis

先是拿到3x3tile(每個tile是2x2像素)的depth min/max,然后每一個tile中和其余的8個點比,如果其余的8個都是min,那么這個就取一個max depth的點。

  • up scaling






up scale這里是4taps dither,depth連續就平均,不連續就取最近

  • 效率



長的raymarch部分是最消耗的。


scene integration

第三部分,integration,也就是把計算好的光照等和場景集成起來。


這里是一個integration完整的示意圖,我們接下來可以一步步看看。

sky scattering

sky scattering算法上是Precomputed Atmospheric Scattering,三個特點:

  • 考慮了earth shadow
  • 分幀實時更新的
  • 存放在32x16x32的LUT中


[ 用于sample sky scatter的深度信息 ]

在sample sky scattering信息的時候,就不是raymarch每一步都踩了,否則雖然更加正確,但是太費了。

最終按照depth信息,就依據depth來sample一次。

[ visibility信息 ]

然后visibility信息(類似shadow)信息都是分離的。

放在一起的效果:


  • 光照組成


把前面列的放在這里:

  • frustum volume lookup
  • ray march result
  • sky scattering / transmittance


  • sky irradiance probe



地圖里32x32的3rd order spherical harmonics probe map, 每個probe覆蓋(256mx256m),這個用作sky irraidance probe。

總結

ppt本身的總結是有這么幾條:

  • volumetric效果是“一等公民”
  • 這是一個統一,基于物理,支持多種材質的scattering/transimitance系統
  • 近處是frustum align的volume based技術
  • 遠處是raymarch based的技術


個人的閱讀總結:除了第一篇的high點之外,有幾點印象非常深刻

  • 對大量的渲染技術運用的如此純熟靈活,非常給力
  • 能夠hold住如此復雜的系統,非常給力


研發的本原的樣子

一系列的筆記,可能是解讀技術文章以來最多的一次了,筆記部分基本上是大家看了原文之后大致能記住的部分,實際上原文涵蓋的內容要更多更雜,然后這背后還有更多的探索和嘗試,因為篇幅的原因沒有寫出來。

讀的時候完全沒法像一些論文,尤其是少項目而重理論和demo向的,可以簡單的做抽象和總結,可以“一句話說清楚”。

實際像《荒野大鏢客2》這樣的項目,這個就是研發中所面臨的問題,理論摻雜著妥協與變通(hack),并且要覆蓋極高的復雜度。

實際做的時候,宏觀的視野?是的;扎實的理論?是的;扎實的engineering?是的;充分的耐心?是的;靈活的變通?是的;

像我個人之前做《天涯明月刀》《無限法則》相關的技術分享,ppt寫的時候往往寫得“重點突出”、“易聽易懂”甚至還帶著兩個笑話;

而實際上,做項目開發中,就是一個復雜度高的多,繁雜的多的過程,但是那么來寫ppt,往往觀眾會聽得云里霧里,所以最終的結果還是“一句話說清楚”。

《荒野大鏢客2》,分享者也足夠耐心,列了方方面面,包括raymarching中優化的幾個失敗案例,確實更像研發原本的樣子。


來源:騰訊游戲學院
回復

使用道具 舉報

5熟悉之中
676/1000
排名
6982
昨日變化
39

4

主題

168

帖子

676

積分

Rank: 5Rank: 5

UID
293049
好友
2
蠻牛幣
2930
威望
0
注冊時間
2018-8-9
在線時間
314 小時
最后登錄
2020-4-28
沙發
2020-3-27 10:13:22 只看該作者
這才是游戲研發該有的樣子,而不是抄抄抄
回復 支持 反對

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 注冊帳號

本版積分規則

5.1勞動節課程大促銷!27日零點開始!
神马电影34pp影视午夜