unity3d shader之實時室外光線散射(大氣散射)渲染


散射需要:吸收,內散射,外散射
分為瑞利散射Rayleigh Scattering和米氏散射 Mie Scattering  后面會詳細講解

大氣中散射由多種原因產生,微粒,塵埃,水蒸氣等等

陽光由於散射增加會減弱並變色
 

物體也會隨着距離增加散射增加而減弱並變色
 
大氣光線散射由於 一天中的時間,天氣,污染的改變而改變

散射共通篇

Radiometric Quantities輻射度量包括:
輻射通量Radiant Flux
輻射率Radiance
輻照度Irradiance


輻射通量Φ (Radiant Flux)
代表通過表面的光照量,輻射強度 (能量/時間),單位:瓦特

輻射率L   (Radiance)
代表一束光線的光照量,輻射通量/面積/立體角,單位:瓦特/(m²*球面角度 )


輻照度E

代表到表面上一個點的光照量,入射輻射通量/面積(瓦特/m²),輻射集中成半球狀



吸收截面積σab   (Absorption cross section)
每輻照度的吸收輻射通量Φ/E,單位:面積(m²)
 
之間關系:
Φ = E*σab
σab = Φ/ E

吸收系數 βab   (Absorption coefficient)
代表粒子密度 ρab  Particle density, 單位:逆長度(m-1)   

總吸收截面積:
Aab = σab * ρab * A *ds
A:介質總面積,ds:介質厚度

吸收的概率:
Pab = Aab/A =σab * ρab * ds = βab

 

光輻射經過固定密度的吸收介質的衰減:
L(s) = L0e-βab*s
s:介質厚度距離
 

外散射

散射截面σsc  Scattering cross section
散射粒子密度ρsc
散射系數βsc  βsc =ρsc * σsc
由於在固定密度的介質的外反射造成的衰減:L(s) = L0e-βsc*s
 

消光 Extinction
吸收與外散射損失的光線就是消光 Extinction
消光系數 Extinction coefficient  βex = βab + βsc
消光產生的總衰減L(s) = L0e-βex*s  --> Fex(s) = e-βex*s


內散射

所有方向的光在視角方向的散射,來自太陽,天空,大地,我們只需要處理來自太陽的內散射即可

散射相函數f(θ, ϕ)
大多數大氣粒子是球形的或非常小  f(θ, ϕ) = f(θ)
f(θ)的用途:
內散射概率:f(θ)* ωsun   In-scatter probability
內散射輻射率:f(θ)* ωsun*Lsun = f(θ)* Esun
θ為light方向與view方向的夾角
 
在同一個路徑(path)中的的內散射
一次事件的輻射率: f(θ)* Esun
在同一個散射距離ds: f(θ)* Esun*βsc*ds

角散射
角散射系數   Angular scattering coefficient    βsc(θ) = βsc*f(θ)
經過ds距離的內散射:Esun*βsc(θ)*ds
βsc(θ)的單位:m-1* steradian-1

增加太陽光穿過固定密度的散射媒介的輻射率
Lin(s, θ) = 1/βex * Esun * βsc(θ)*(1- e-βex*s)
 

消光與內散射

L (s, θ) = L0Fex(s) +Lin(s, θ)  

對比GPU 霧渲染
L (s, θ) = L0(1-f(s)) +Cfog*f(s)
單純的權重運算,效果不好 


瑞利散射  Rayleigh Scattering

粒子微小(r<0.05 λ)

相函數:
fr(θ) = 3/(16 *π)*(1+cos²θ)
 
瑞利散射是米氏散射的一種
當光線穿過大氣層,大氣中氣體藍色部分瑞利散射強烈,但是紅色或黃色等波長長的瑞利散射很弱。
由於天空產生的藍色的光的散射,陽光到地面的顏色發黃。在日出日落中, 由於空氣密度的增加和地球表面附近的粒子,瑞利散射效應更明顯。
相比之下,水滴組成雲與可見光的波長大小類似,更傾向於米氏散射而非瑞利散射。假設所有可見光的波長分布大致相同,因此雲看起來是是白色或灰色的。

米氏散射   Mie Scattering

煙霧和雲散射牛奶、生物組織和乳膠漆之類大粒子
在多雲天氣主要是米氏散射(水滴)

發生米氏散射的介質中粒子大,為球形粒子

 

我們用Henyey-Greenstein函數來近似相函數
fHG(θ) = (1-g) 2/(4*π* (1+g2-2g*cos (θ)))3/2
g為各向異性因子anisotropy factor

波長相關性復雜度取決於粒子的大小
現實中,空氣經常包含各種各樣大小的米氏粒子Mie particles的混合,總的來說任何波長相關性傾向於平均

混合散射

現實中,空氣中瑞利散射和米氏散射都有
通常情況下,光線被吸收是輕微的

βex = βscRayleigh +βscMie

 

總結與實現

shader中:
傳入參數:
βscRayleigh
βscMie
gHG
常量:
E0sun
Esun收到消光extinction影響所以不是常量


陽光能量傳到地面上會有衰減

 

注意:

起點處最初的陽光是白色的

密度不是常量

 

實現所需的所有公式:

關鍵部分實現代碼:

<span style="font-size:14px;">float s = (GetDepth(i.uv_MainTex)-0.8)*5;
			float Fex = pow(e, -(_Beta_R + _Beta_M)* s);


			float beta_r = 3 / (16 * PIE)*_Beta_R*(1 + cos_theta* cos_theta);
			float beta_m = 1 / (4 * PIE) * _Beta_M * (1 - _G)*(1 - _G) / pow((1 + _G * _G - 2 * _G*cos_theta), 3 / 2);

			float3 Lin = (beta_r + beta_m) / (_Beta_R + _Beta_M)* _Sun * (1 - pow(e, -(_Beta_R + _Beta_M)* s));

			float3 L = _Sun * Fex + color.rgb *Lin;</span>

 

實現結果

瑞利散射

 

米氏散射

混合散射

 

參考:Rendering Outdoor Light Scattering in Real Time

 

 

                                             -----   by  wolf96   

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM