基于物理的大气渲染技术#
NOTE这里仅提供相关的理论知识与公式,至于更加详细的渲染方案(比如公式在着色器中的近似计算,各项参数基于不同引擎与情景的设置,考虑臭氧的影响,优化GPU计算指令等等)建议您亲自阅览这方面相关的着色器文件。
这里是一份MC光影(Eclipse)的大气渲染着色器文件(有较为详细的注释)
Eclipse_Shader的github官方仓库
在此先叠甲:本人也是才开始学习,如有错误不当之处请多多包涵,欢迎评论区指出。
1. 瑞利散射(Rayleigh Scattering)#
条件:散射粒子尺寸远小于光的波长
特点:
- 散射强度与波长的4次方成反比:I∝1/λ4
- 前向和后向散射几乎对称(偶极子辐射模式)
散射截面积: 物理上描述一个粒子散射光的能力。
在图形学中我们并不直接用绝对物理值,而是使用瑞利散射系数 β_R,它包含密度和截面积,并分解为 RGB 三个通道分别的系数。
通常在 RGB 渲染中,我们将瑞利散射系数定义为海平面处的值(单位:m⁻¹):
β_R = (5.8e-6, 13.5e-6, 33.1e-6) // R, G, B
2. 米氏散射(Mie Scattering)#
条件:粒子尺寸接近或大于波长
- 散射强度几乎不依赖波长(所有颜色一样被散射)
- 强烈前向散射:大部分光沿着原方向继续前进,形成太阳周围的光晕。
散射系数: 图形学中设为一个常数(或略带波长依赖),通常取:
β_M = (2.0e-5, 2.0e-5, 2.0e-5) // 海平面值
3. 衰减与光学深度(Optical Depth)#
光在介质中传播时,不仅会被散射到视线中(内散射),还会因为散射和吸收而衰减(外散射消光)。
消光系数(单位 m^-1):
βe=βs+βa这里我们通常忽略吸收,只考虑散射,所以:βe=βs
穿过距离 ds 后的强度变化:
dI=−βeIds解此微分方程得到 Beer-Lambert 定律:
I(s)=I0exp(−∫0sβe(s′)ds′)定义光学深度τ:
τ=∫0sβe(s′)ds′透射率T<入射光经过这段距离后剩下的比例>入射光经过这段距离后剩下的比例>
T(s)=e−τ4. 大气密度模型 (Density Model)#
散射系数与粒子数密度成正比,密度随海拔高度 h(单位 km)指数衰减。
(1)瑞利散射(空气分子)归一化密度:
ρR(h)=exp(−HRh)典型瑞利标高 HR≈8km
(2)米氏散射(气溶胶)归一化密度:
ρM(h)=exp(−HMh)典型米氏标高 HM≈1.2km
任意高度 h 处的实际散射系数:
βR(h)=βR0⋅ρR(h),βM(h)=βM0⋅ρM(h)海平面系数典型值:
βR0=(5.8×10−6, 13.5×10−6, 33.1×10−6)(R,G,B)βM0=(2.0×10−5, 2.0×10−5, 2.0×10−5)5. 单次散射模型 (Single Scattering)#
总辐射亮度积分:
L=∫OP[Isun⋅T(Sun→X)⋅βs(X)⋅P(θ)⋅T(X→O)]ds其中:视线方向V,相机位置O,太阳辐照度Isun,每个点X的散射贡献包括:太阳到X的衰减、&X&处散射、X到相机的衰减
Ltotal=LR+LMLR=∫OPIsun⋅TR(Sun→X)⋅βR(X)⋅PR(θ)⋅TR(X→O)dsLM=∫OPIsun⋅TM(Sun→X)⋅βM(X)⋅PM(θ)⋅TM(X→O)ds透射率由光学深度给出:
TR(path)=exp(−∫pathβR(s)ds)TM(path)=exp(−∫pathβM(s)ds)瑞利相位函数:
PR(θ)=16π3(1+cos2θ)米氏相位函数(Cornette-Shanks 近似):
PM(θ,g)=8π3(2+g2)(1+g2−2gcosθ)3/2(1−g2)(1+cos2θ)6. Ray Marching 数值积分#
将视线分成N段(N= 10 ~ 16)
总距离L,步长ds=L/N,采样点:
Xi=O+(i+21)ds⋅V,i=0,…,N−1每个Xi步骤:
- 海拔高度 hi=Xi−REarth
- 计算 βR(hi),βM(hi)
- 计算太阳到 Xi 的光学深度 τRsun,τMsun
- 累加相机到 Xi的光学深度
τRcam+=βR(hi)ds,τMcam+=βM(hi)ds散射角余弦 cosθ=V⋅D (D为太阳方向单位向量),累加贡献:
LR+=Isun⋅TRsun⋅βR⋅PR⋅TRcam⋅dsLM+=Isun⋅TMsun⋅βM⋅PM⋅TMcam⋅ds最终颜色:
C=LR⋅βR0rgb+LM⋅βM0rgb7. 太阳透射率计算#
太阳到散射点 X 的光学深度需沿太阳方向 D 从 X 积分到大气顶层。
简单方法:在主循环内再嵌套一个小的 Ray Marching 循环,步数 M 较小(如 5 步)。
伪公式(单通道):
τsun=j=0∑M−1β0⋅exp(−Hh(Yj))⋅dssun8. 地球-大气几何求交#
交点公式:
∥O∥2+2t(O⋅V)+t2=R2Δ=4[(O⋅V)2−(∥O∥2−R2)]判别式小于0不相交,否则:
t=−(O⋅V)±2Δ