散射需要:吸收,內散射,外散射
分為瑞利散射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