大气散射
1. 大气散射的物理原理
大气
瑞利散射(Rayleigh Scattering)
瑞利散射是由于大气分子对光的散射,而产生的一种散射现象。瑞利散射的散射截面与波长的四次方成反比,所以对于短波长的光,瑞利散射的散射截面很大,而对于长波长的光,瑞利散射的散射截面很小。所以,瑞利散射主要发生在蓝色光波段,而红色光波段的散射很小。这就是为什么天空是蓝色的原因。
柯西散射(Cauchy Scattering)
柯西散射是由于大气中的尘埃对光的散射,而产生的一种散射现象。柯西散射的散射截面与波长的四次方成正比,所以对于长波长的光,柯西散射的散射截面很大,而对于短波长的光,柯西散射的散射截面很小。所以,柯西散射主要发生在红色光波段,而蓝色光波段的散射很小。这就是为什么夕阳是红色的原因。
2. 大气散射的数学模型
2.1. 瑞利散射
\[\begin{aligned} I_{\lambda} &= I_{\lambda 0} e^{-\tau_{\lambda}} \\ \tau_{\lambda} &= \frac{8\pi^3}{3} \frac{1}{\lambda^4} \frac{1}{\mu} \frac{1}{\rho} \\ \mu &= \cos \theta \\ \rho &= \frac{p}{p_0} \end{aligned}\]透明混合
在大气散射模型中,计算得到了大气层对RGB三个通道的光的吸收系数,那么我们就可以根据吸收系数来计算大气层对RGB三个通道的光的透射系数,然后将透射系数与散射系数进行混合,得到最终的透明混合系数。
但是传统的渲染管线中,并不支持三个$\alpha$系数的透明混合,
一个方法是将三个$\alpha$系数进行合并,得到一个新的$\alpha$系数
\[\begin{aligned} \alpha &= 1 - (1 - \alpha_1)(1 - \alpha_2)(1 - \alpha_3) \\ \end{aligned}\]或加权平均
\[\begin{aligned} \alpha &= \frac{\alpha_1 + \alpha_2 + \alpha_3}{3} \\ \end{aligned}\]另一个方法是使用MRT(Multiple Render Targets)技术,将大气颜色与透射率分别储存到两张纹理中,然后使用计算着色器将两张纹理与屏幕颜色进行混合。(如果不支持计算着色器也可以将屏幕纹理拷贝一份后与大气颜色与透射率一同作为纹理计算屏幕颜色)