游戏开发者怎么做出以假乱真的画面效果?大气散射渲染了解一下
參與介質(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 臭氧層吸收
另一個容易忽視的效應是臭氧層吸收對于大氣散射效果的影響。
具體的實現方案也很簡單,QQ號碼買賣就是調整瑞利散射的吸收系數。
可以看到,尤其在太陽接近地平線的時候,天空的色彩會有比較明顯的差異。
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).
總結
以上是生活随笔為你收集整理的游戏开发者怎么做出以假乱真的画面效果?大气散射渲染了解一下的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在UE4中创建受《羞辱》启发的环境
- 下一篇: Cornfox Bros.如何将手游移