遊戲開發者怎麼做出以假亂真的畫面效果?大氣散射渲染瞭解一下

Bence,騰訊互動娛樂 遊戲客戶端開發發表於2020-09-02
遊戲渲染做得好不好,看看天空就知道了。本文作者Bence將和大家分享遊戲中基於物理的大氣散射渲染,聊聊如何做出更好看的天空、霧氣等等。
參與介質(Participating media)

參與介質是另一種現實中常見的介質,這種介質中粒子分散在一定體積內,比如煙霧、雲、牛奶、大氣等。

相比於一般的固體材質,光在這類材質中會傳播一段較長的距離,因此不能用雙向反射分佈函式(BRDF)來描述光的傳播。

1.1 參與介質的傳播特性

光在參與介質中的傳播主要有四個部分。

第一個是參與介質中的粒子本身會吸收光能,轉換成其他形式的能量,這樣在傳播路徑上的光就會衰減。

第二種是出散射,也就是散射,說的是光遇到粒子時,粒子會分散光的傳播方向,因此也會減弱傳播路徑上的光。

第三種是粒子本身是發光的,這會加強傳播路徑上的光。

最後一種是入散射,其實本質上跟出散射是一個東西,也是粒子對光的散射,但入散射是指從其他傳播路徑上散射到當前傳播路徑上的現象,這會加強當前路徑上的光的能量。

遊戲開發者怎麼做出以假亂真的畫面效果?大氣散射渲染瞭解一下

這四種現象就是光在參與介質中傳播時視覺表現的基礎。

下面的表展示了參與介質四種傳播特性相對於的引數。

遊戲開發者怎麼做出以假亂真的畫面效果?大氣散射渲染瞭解一下

1.2 相位函式(Phase Function)

相位函式是用於描述粒子散射的分佈函式。

因為當粒子散射光的時候,在各個方向上,散射的能量是不一樣的,而且不同的粒子這個散射分佈也不一樣,所以,我們需要一個函式來描述這種分佈。

通過相位函式我們可以得到這個方向上散射的光能佔比.粒子的散射其實是個比較複雜的過程,而且與粒子大小和光波波長之間的比例關係是有關的,按照這個大小關係,可以分為三類散射。

遊戲開發者怎麼做出以假亂真的畫面效果?大氣散射渲染瞭解一下 ,rr為粒子半徑,\lambdaλ為波長。

遊戲開發者怎麼做出以假亂真的畫面效果?大氣散射渲染瞭解一下 ,為瑞利散射(Rayleigh scattering)。

遊戲開發者怎麼做出以假亂真的畫面效果?大氣散射渲染瞭解一下 ,為米氏散射(Mie scattering)。

遊戲開發者怎麼做出以假亂真的畫面效果?大氣散射渲染瞭解一下 ,為幾何散射(Geometric scattering)。

1.3 瑞利散射(Rayleigh scattering)

瑞利散射的phase function可以用這個方程來描述:

遊戲開發者怎麼做出以假亂真的畫面效果?大氣散射渲染瞭解一下

從下圖中可以看出瑞利散射相對來說,方向性沒有那麼強。

遊戲開發者怎麼做出以假亂真的畫面效果?大氣散射渲染瞭解一下

但瑞利散射的散射係數與光波的波長有很大的關係,這也是我們的地球大氣呈現出色彩變化的原因,主要就是瑞利散射的光波相關性導致的。

1.4 米氏散射(Mie scattering)

相比瑞利散射,米氏散射就具有很強的方向性。

米氏散射方程比較複雜,一般實際中會用其他一些簡化的方程代替,其中Henyey-Greenstein,簡稱HG方程就是比較常用的。

遊戲開發者怎麼做出以假亂真的畫面效果?大氣散射渲染瞭解一下

HG方程會有一個引數g用於控制散射的分佈形狀,當g小於0時,散射更多的是逆向的,等於0的時候是各向同性的,也就是在各個方向上散射的光能量是相等的,如果大於0就表示光更多的能量會向前傳播。

還有另外一個常用的Schlick近似。

遊戲開發者怎麼做出以假亂真的畫面效果?大氣散射渲染瞭解一下

遊戲開發者怎麼做出以假亂真的畫面效果?大氣散射渲染瞭解一下

這個方程的計算量更小,但是當g比較大的時候近似值會偏離較大。

另一個,米氏散射的特點,就是相比於瑞利散射,光波對散射的影響沒有那麼大。

1.5 幾何散射(Geometric scattering)

第三種常見散射是幾何散射,這種散射主要關注那些粒子遠大於光波的情況
因為粒子比較大,因此需要考慮光在粒子表面的反射與折射現象。

一個現實中常見的現象就是彩虹的形成,因為空氣中散佈著大尺寸的水粒子,當光照射的時候,會在水粒子表面以及內部發生折射。

由於不同波長的光的折射係數也是不同的,因此產生了色散的想象,也就形成了彩虹。

遊戲開發者怎麼做出以假亂真的畫面效果?大氣散射渲染瞭解一下


大氣散射(Atmosphere Scattering)

地球大氣的渲染主要包含兩種散射,瑞利散射以及米氏散射,瑞利散射主要構成了天空的顏色變化,而米氏散射則造成了太陽周圍的光環效果。

遊戲開發者怎麼做出以假亂真的畫面效果?大氣散射渲染瞭解一下

2.1 大氣瑞利散射引數:

遊戲開發者怎麼做出以假亂真的畫面效果?大氣散射渲染瞭解一下

遊戲開發者怎麼做出以假亂真的畫面效果?大氣散射渲染瞭解一下 表示散射係數, 遊戲開發者怎麼做出以假亂真的畫面效果?大氣散射渲染瞭解一下 表示衰減係數。
h表示海拔。
HR表示大氣密度衰減係數。
n表示大氣的折射係數。
N表示海平面的粒子密度。

2.2 大氣米氏散射引數:

遊戲開發者怎麼做出以假亂真的畫面效果?大氣散射渲染瞭解一下

遊戲開發者怎麼做出以假亂真的畫面效果?大氣散射渲染瞭解一下

遊戲開發者怎麼做出以假亂真的畫面效果?大氣散射渲染瞭解一下 表示散射係數, 遊戲開發者怎麼做出以假亂真的畫面效果?大氣散射渲染瞭解一下 表示衰減係數。
h表示海拔。
HM表示大氣密度衰減係數。

遊戲開發者怎麼做出以假亂真的畫面效果?大氣散射渲染瞭解一下 表示海平面的米氏散射係數。

2.3 臭氧層吸收

另一個容易忽視的效應是臭氧層吸收對於大氣散射效果的影響。

具體的實現方案也很簡單,就是調整瑞利散射的吸收係數。

可以看到,尤其在太陽接近地平線的時候,天空的色彩會有比較明顯的差異。

遊戲開發者怎麼做出以假亂真的畫面效果?大氣散射渲染瞭解一下

2.4 單次散射(Single Scattering)

單次散射公式如下:

遊戲開發者怎麼做出以假亂真的畫面效果?大氣散射渲染瞭解一下

遊戲開發者怎麼做出以假亂真的畫面效果?大氣散射渲染瞭解一下 表示到達視點的入射光。

遊戲開發者怎麼做出以假亂真的畫面效果?大氣散射渲染瞭解一下 表示透過率(Transmittance), 遊戲開發者怎麼做出以假亂真的畫面效果?大氣散射渲染瞭解一下 表示之間累積的光照衰減。

遊戲開發者怎麼做出以假亂真的畫面效果?大氣散射渲染瞭解一下 表示物體表面光照。

遊戲開發者怎麼做出以假亂真的畫面效果?大氣散射渲染瞭解一下 表示散射光。

散射光的計算公式如下:

遊戲開發者怎麼做出以假亂真的畫面效果?大氣散射渲染瞭解一下

遊戲開發者怎麼做出以假亂真的畫面效果?大氣散射渲染瞭解一下 表示相位函式。

遊戲開發者怎麼做出以假亂真的畫面效果?大氣散射渲染瞭解一下 表示可見性,陰影。

遊戲開發者怎麼做出以假亂真的畫面效果?大氣散射渲染瞭解一下 表示到達取樣點xx的光照。

透過率公式如下:

遊戲開發者怎麼做出以假亂真的畫面效果?大氣散射渲染瞭解一下

遊戲開發者怎麼做出以假亂真的畫面效果?大氣散射渲染瞭解一下 稱為光學深度(Optical depth)。

2.5 多重散射(Multi-Scattering)

前面我們看到了單次散射的計算過程,有單次與之相對的就有多重散射,多重散射的概念也很簡單,多重散射就是經過多次散射然後到達視點。

遊戲開發者怎麼做出以假亂真的畫面效果?大氣散射渲染瞭解一下

多重散射的計算可以通過多次迭代實現,也就是用前一次散射的結果作為下一重散射的光源。

圖中,可以看出,上面的是單次散射的結果,下面的是多重散射的結果,還是可以比較明顯能看出區別的。

遊戲開發者怎麼做出以假亂真的畫面效果?大氣散射渲染瞭解一下

2.6 常見方案

現在我們已經知道散射是如何計算了,有公式之後,如果我們不考慮效能,通過蒙特卡洛積分法暴力求解的方式,就可以求得結果。

但很顯然,實時計算的話,這種方式計算量就太大了,下面我們就看下目前常見的一些方案。

第一種就是靠美術同學預製一些天空的紋理貼圖,然後通過插值的方式達到一定程度的動態性,這種方案比較大的問題就是如果要做比較複雜的動態會比較難,因為當我們的影響因子越多,意味著預製的貼圖數量會指數級增加。

第二種就是公式擬合[PSS99] [HW12] [CIE94],這種方式就是通過一個公式去直接計算大氣散射的結果,這種方案也缺乏一定的可定製性。

第三種也是公式擬合的思路,但是與第二種不一樣的是,這種擬合只會擬合計算中的一部分。

其中最出名,應用比較廣泛的應該就是GPU Gems中的演算法,作者通過公式擬合了光學深度的計算,從而使得透射率可以通過公式直接求解。這樣就可以對積分公式進行降維,單次散射就只需要計算一重積分,這樣的話實時計算效能也是可以接收的。但這種方案相對來說效果上還是與ground truth會有一定差距,而且如果我們考慮多重散射的話,即便是通過擬合減少了一重積分,計算量依然是很大的[ONeil05] [Schüler12]。

遊戲開發者怎麼做出以假亂真的畫面效果?大氣散射渲染瞭解一下

最後一種方案,是預計算的方案[Ril04] [Wen07] [Yus15] [Brun08] [Elek09],通過預計算積分結果,儲存在LUT中,然後實時通過取樣LUT獲得結果,這種方案也是目前PC以及主機上最主流的方案。

這種方案的優勢就是效果是非常好的,因為是離線的計算,因此可以做到非常接近ground truth,比如多重散射,在這種方案中非常方便的就可以實現,而且沒有額外的實時效能開銷。

但是預計算通常最大的問題就是引數維度太多導致預計算的資料量會太大,不過通過業界大佬們的努力,以及可以將預計算的引數維度降到3維,另外通過將相位函式這種高頻資訊剝離到實時計算。

可以進一步減少LUT的解析度,使得預計算的資料變得很小。

具體的演算法其實並不複雜,最終,只需要通過海拔、太陽的照射角度、以及視角這三個引數預計算大氣散射的結果就可以了。

另外相位函式會被從積分中提出來,然後實時去計算,和取樣的LUT結合計算最終的結果。

遊戲開發者怎麼做出以假亂真的畫面效果?大氣散射渲染瞭解一下

大氣散射與高度霧(Height Fog)

高度霧也是目前非常常見的霧效方案,一般計算的方式就是通過解析式計算霧的光學深度得到透射率,然後blend一個霧的顏色。

但是如果我們從前面的散射公式去看這種計算的話,我們會發現,直接混合霧的顏色其實是對散射光一個簡化。

如果我們希望獲得更好的效果,很顯然我們需要一個更接近ground truth的版本,所以我們需要用當前的光照環境帶入到高度霧的計算中。

這裡我們主要的參考就是decima在17年siggraph上的分享。

遊戲開發者怎麼做出以假亂真的畫面效果?大氣散射渲染瞭解一下

下面是他們的具體做法,其實公式非常簡單,就是一個alpha blend,也就是之前我們的高度霧是blend一個顏色,這裡改成blend Lsun加Lamb。

而這裡的Lsun就是太陽的直接光經過霧效衰減後的結果,Lambient是大氣散射結果經過霧效衰減後的結果,這兩個結果也會通過預計算的方式儲存在LUT中。

遊戲開發者怎麼做出以假亂真的畫面效果?大氣散射渲染瞭解一下

下圖是sponza場景中的效果,上圖是原始的高度霧,Blend一個純色,下圖是結合了大氣散射的效果,可以看出右側的霧效會更有光感。

遊戲開發者怎麼做出以假亂真的畫面效果?大氣散射渲染瞭解一下

遊戲開發者怎麼做出以假亂真的畫面效果?大氣散射渲染瞭解一下

References:


[Brun08] Bruneton, Eric, and Fabrice Neyret. “Precomputed atmospheric scattering.” Computer graphics forum. Vol. 27. No. 4. Oxford, UK: Blackwell Publishing Ltd, 2008.
[CIE94] AC08352780, Anonymus, ed. “Spatial distribution of daylight-luminance distributions of various reference skies.” CIE, 1994.
[Elek09] Elek, Oskar. “Rendering parametrizable planetary atmospheres with multiple scattering in real-time.” Proceedings of the Central European Seminar on Computer Graphics. Citeseer, 2009.
[Giliam17] “Decima Engine: Advances in Lighting and AA.” SIGGRAPH 2017 Conference. 2017.
[Hill16] Hillaire, Sbastien. “Physically based sky, atmosphere and cloud rendering in frostbite.” ACM SIGGRAPH. 2016.
[HW12] Hosek, Lukas, and Alexander Wilkie. “An analytic model for full spectral sky-dome radiance.” ACM Transactions on Graphics (TOG) 31.4 (2012): 1-9.
[ONeil05] O’Neil, Sean. “Accurate atmospheric scattering.” Gpu Gems 2 (2005): 253-268.
[Ril04] Riley, Kirk, et al. “Efficient rendering of atmospheric phenomena.” Rendering Techniques 4 (2004): 374-386.
[PSS99] Preetham, Arcot J., Peter Shirley, and Brian Smits. “A practical analytic model for daylight.” Proceedings of the 26th annual conference on Computer graphics and interactive techniques. 1999.
[Sébas20] Sébastien Hillaire. “A Scalable and Production Ready Sky and Atmosphere Rendering Technique”. Eurographics Symposium on Rendering. 2020.
[Schüler12] Schüler, Christian. “An approximation to the chapman grazing-incidence function for atmospheric scattering.” GPU PRO 3: Advanced Rendering Techniques (2012): 105.
[Wen07] Wenzel, Carsten. “Real-Time atmospheric effects in games revisited.” Game Developers Conference. 2007.
[Yus15] Yusov, Egor. “Outdoor light scattering sample update.” URL: https://software. intel. com/en-us/blogs/2013/09/19/otdoor-lightscattering-sample-update (2015).


作者:Bence,騰訊互動娛樂 遊戲客戶端開發
來源:騰訊GWB遊戲無界
地址:https://mp.weixin.qq.com/s/hP_a_6z5cgnYrt4gRCeyVA


相關文章