一、介绍
在先前的教程中,我们推导了一个方程,为着色器中的大气散射提供了一个良好的框架。然而,我们忽略了一个事实,即单个方程不会产生可信的结果。如果我们想要一个看起来不错的大气着色器,我们必须提升我们的数学水平。
光与物质之间的相互作用非常复杂,没有简单的方法可以完全描述它。建模大气散射实际上非常困难。问题的一部分源于大气不是一个均匀的介质。大气的密度和组成都随着海拔的变化而显著变化,几乎不可能提出一个"完美"的模型。
这就是为什么科学文献提出了几种散射模型,每一种都设计用来描述在特定条件下发生的光学现象的子集。行星展现出的大多数光学效应可以通过考虑两种不同的模型来重现:瑞利散射
和米氏散射
。这两种数学工具可以预测光在不同大小的物体上的散射方式。前者模拟了光如何被构成大部分空气的氧气和氮气分子反射。后者模拟了光在悬浮在较低大气中的较大化合物上的反射,如花粉、灰尘和污染物。
瑞利散射使天空呈现蓝色,日落呈现红色。米氏散射使云朵呈现白色。如果你想了解更多,我们将不得不更深入地探讨散射的数学原理。
二、瑞利散射
光子碰到粒子后会发生什么呢?要回答这个问题,首先需要以更正式的方式重新定义它。让我们想象一束光线穿过空旷的空间,突然与一个粒子碰撞。这种碰撞的结果根据粒子的大小和光的颜色而有很大的变化。如果粒子足够小(比如原子和分子),那么光的行为最好通过瑞利散射
来预测。
发生的情况是一部分光继续其旅程而不受影响。然而,原始光的一小部分与粒子发生相互作用,并在所有方向上散射。然而,并非所有方向都会受到相等数量的光照。光子更有可能直接穿过粒子或者被弹回。相反,光子被偏转90度的可能性较小。这种行为可以在下面的图示中看到,蓝线显示了散射光的首选方向。
这种光学现象在瑞利散射方程 <math xmlns="http://www.w3.org/1998/Math/MathML"> S ( λ , θ , h ) S \left(\lambda, \theta, h \right ) </math>S(λ,θ,h) 中得到数学描述,该方程告诉了原始光 <math xmlns="http://www.w3.org/1998/Math/MathML"> I 0 I_0 </math>I0 散射到方向 <math xmlns="http://www.w3.org/1998/Math/MathML"> θ \theta </math>θ 的比率:
<math xmlns="http://www.w3.org/1998/Math/MathML"> I = I 0 S ( λ , θ , h ) I = I_0 \, S \left(\lambda, \theta, h\right) </math>I=I0S(λ,θ,h)
<math xmlns="http://www.w3.org/1998/Math/MathML"> S ( λ , θ , h ) = π 2 ( n 2 − 1 ) 2 2 ρ ( h ) N ⏟ 密度 1 λ 4 ⏞ 波长 ( 1 + cos 2 θ ) ⏟ 几何 S \left(\lambda, \theta, h\right ) = \frac{\pi^2 \left(n^2-1 \right )^2}{2} \underset{\text{密度}}{\underbrace{\frac{\rho\left(h\right)}{N}}} \overset{\text{波长}}{\overbrace{\frac{1}{\lambda^4}}} \underset{\text{几何}}{\underbrace{\left(1+\cos^2\theta \right )}} </math>S(λ,θ,h)=2π2(n2−1)2密度 Nρ(h)λ41 波长几何 (1+cos2θ)
其中:
- <math xmlns="http://www.w3.org/1998/Math/MathML"> λ \lambda </math>λ:入射光的波长;
- <math xmlns="http://www.w3.org/1998/Math/MathML"> θ \theta </math>θ:散射角度;
- <math xmlns="http://www.w3.org/1998/Math/MathML"> h h </math>h:点的海拔高度;
- <math xmlns="http://www.w3.org/1998/Math/MathML"> n = 1.00029 n=1.00029 </math>n=1.00029:空气的折射率;
- <math xmlns="http://www.w3.org/1998/Math/MathML"> N = 2.504 ⋅ 1 0 25 N=2.504 \cdot 10^{25} </math>N=2.504⋅1025:标准大气层的分子数密度。这是每立方米的分子数;
- <math xmlns="http://www.w3.org/1998/Math/MathML"> ρ ( h ) \rho\left(h\right) </math>ρ(h):密度比。该数字在海平面上等于1,并随着 <math xmlns="http://www.w3.org/1998/Math/MathML"> h h </math>h 指数递减。关于这个函数有很多值得讨论的地方,我们将在本系列的未来文章中详细介绍。
关于瑞利散射
的第一件事是,某些方向接收到的光比其他方向多。第二个重要方面是散射光的数量强烈依赖于入射光的波长 <math xmlns="http://www.w3.org/1998/Math/MathML"> λ \lambda </math>λ 。下面的极坐标图可视化了三种不同波长的 <math xmlns="http://www.w3.org/1998/Math/MathML"> S ( λ , θ , 0 ) S\left(\lambda, \theta, 0\right) </math>S(λ,θ,0) 。在海平面处评估 <math xmlns="http://www.w3.org/1998/Math/MathML"> S S </math>S,通常称为在海平面处进行散射。
下面的图像显示了可见光谱连续范围的散射系数的渲染(代码可在ShaderToy上找到)。
图像中心是黑色的,因为该范围内的波长超出了可见光谱。
三、瑞利散射系数
瑞利散射方程指示了有多少光朝特定方向散射。然而,它并不告诉我们总共散射了多少能量。要计算这一点,我们需要考虑所有方向上的能量分散。这样的推导不适合心脏脆弱者;如果你对高级微积分不熟悉,这就是结果:
<math xmlns="http://www.w3.org/1998/Math/MathML"> β ( λ , h ) = 8 π 3 ( n 2 − 1 ) 2 3 ρ ( h ) N 1 λ 4 \beta \left(\lambda, h \right )=\frac{8\pi^3 \left(n^2-1 \right )^2}{3} \frac{\rho\left(h\right)}{N} \frac{1}{\lambda^4} </math>β(λ,h)=38π3(n2−1)2Nρ(h)λ41
其中 <math xmlns="http://www.w3.org/1998/Math/MathML"> β ( λ , h ) \beta \left(\lambda, h \right ) </math>β(λ,h) 表示单个粒子碰撞后散射的能量分数。这通常被称为瑞利散射系数
。
如果你已经阅读了本教程的前一部分,你可能已经猜到了, <math xmlns="http://www.w3.org/1998/Math/MathML"> β \beta </math>β 实际上是在定义线段 <math xmlns="http://www.w3.org/1998/Math/MathML"> A B ‾ \overline{AB} </math>AB 上的透射率 <math xmlns="http://www.w3.org/1998/Math/MathML"> T ( A B ‾ ) T\left(\overline{AB}\right) </math>T(AB) 中使用的消光系数
。
不幸的是,计算 <math xmlns="http://www.w3.org/1998/Math/MathML"> β \beta </math>β 非常昂贵。在我们将要编写的着色器中,我们将尽量节省尽可能多的计算。因此,将散射系数中的所有常数因子"提取"出来是很有用的,这样我们就得到了海平面(h=0)的瑞利散射系数
<math xmlns="http://www.w3.org/1998/Math/MathML"> β ( λ ) \beta \left(\lambda \right ) </math>β(λ):
<math xmlns="http://www.w3.org/1998/Math/MathML"> β ( λ ) = 8 π 3 ( n 2 − 1 ) 2 3 1 N 1 λ 4 \beta \left(\lambda \right )=\frac{8\pi^3 \left(n^2-1 \right )^2}{3} \frac{1}{N} \frac{1}{\lambda^4} </math>β(λ)=38π3(n2−1)2N1λ41
这个新方程提供了另一种理解不同颜色的光如何被散射的方式。下图显示了作为波长函数的散射光所受到的影响。

正是散射系数 <math xmlns="http://www.w3.org/1998/Math/MathML"> β \beta </math>β 和 <math xmlns="http://www.w3.org/1998/Math/MathML"> λ \lambda </math>λ 之间的强烈关系最终使得日落的天空呈现红色。我们从太阳接收到的光子分布在广泛的波长范围内。瑞利散射告诉我们,地球大气中的原子和分子更强烈地散射蓝光,而不是绿光或红光。如果光线足够长,所有的蓝光都会被散射消失。这正是在日落时发生的情况,当光线几乎与地表平行时。
用同样的推理,我们可以理解为什么天空呈现出蓝色。太阳的光具有特定的方向。然而,它的蓝色成分会朝着每个方向散射。当你看向天空时,蓝光来自每个方向。
四、瑞利相位函数
将描述瑞利散射的原始方程 <math xmlns="http://www.w3.org/1998/Math/MathML"> S ( λ , θ ) S \left(\lambda, \theta\right ) </math>S(λ,θ) 分解为两个组成部分。其中一个是我们刚刚推导出的散射系数 <math xmlns="http://www.w3.org/1998/Math/MathML"> β ( λ ) \beta \left(\lambda\right ) </math>β(λ),它调节了散射的强度。第二部分与散射的几何形状有关,控制着其方向:
<math xmlns="http://www.w3.org/1998/Math/MathML"> S ( λ , θ , h ) = β ( λ , h ) γ ( θ ) S \left(\lambda, \theta, h\right ) = \beta \left(\lambda, h\right ) \gamma \left(\theta\right) </math>S(λ,θ,h)=β(λ,h)γ(θ)
这个新量 <math xmlns="http://www.w3.org/1998/Math/MathML"> γ ( θ ) \gamma \left(\theta\right) </math>γ(θ) 可以通过将 <math xmlns="http://www.w3.org/1998/Math/MathML"> S ( λ , θ , h ) S \left(\lambda, \theta, h\right ) </math>S(λ,θ,h) 除以 <math xmlns="http://www.w3.org/1998/Math/MathML"> β ( λ ) \beta \left(\lambda\right ) </math>β(λ) 获得:
<math xmlns="http://www.w3.org/1998/Math/MathML"> γ ( θ ) = S ( λ , θ , h ) β ( λ ) = \gamma \left(\theta\right) = \frac{S \left(\lambda, \theta, h\right )} {\beta \left(\lambda\right )}= </math>γ(θ)=β(λ)S(λ,θ,h)=
<math xmlns="http://www.w3.org/1998/Math/MathML"> = π 2 ( n 2 − 1 ) 2 2 ρ ( h ) N 1 λ 4 ( 1 + cos 2 θ ) ⏟ S ( λ , θ , h ) 3 8 π 3 ( n 2 − 1 ) 2 N ρ ( h ) λ 4 ⏟ 1 β ( λ ) = = \underset{S \left(\lambda, \theta, h\right )}{\underbrace{ \frac{\pi^2 \left(n^2-1 \right )^2}{2} \frac{\rho\left(h\right)}{N} \frac{1}{\lambda^4} \left(1+\cos^2\theta \right ) }} \, \underset{\frac{1}{\beta \left(\lambda\right )}}{\underbrace{ \frac{3}{8\pi^3 \left(n^2-1 \right )^2} \frac{N}{\rho\left(h\right)} \lambda^4 }}= </math>=S(λ,θ,h) 2π2(n2−1)2Nρ(h)λ41(1+cos2θ)β(λ)1 8π3(n2−1)23ρ(h)Nλ4=
<math xmlns="http://www.w3.org/1998/Math/MathML"> = 3 16 π ( 1 + cos 2 θ ) = \frac{3}{16\pi} \left(1+\cos^2 \theta\right) </math>=16π3(1+cos2θ)
可以看出,这个新的表达式不依赖于入射光的波长。这可能看起来有些反直觉,因为我们确实知道瑞利散射更多地影响较短的波长。
然而, <math xmlns="http://www.w3.org/1998/Math/MathML"> γ ( θ ) \gamma \left(\theta\right) </math>γ(θ) 所模拟的是我们之前见过的偶极子的形状。术语 <math xmlns="http://www.w3.org/1998/Math/MathML"> 3 16 π \frac{3}{16\pi} </math>16π3 充当一个归一化因子,使所有可能角度 <math xmlns="http://www.w3.org/1998/Math/MathML"> θ \theta </math>θ的积分总和为1。更技术性地说,可以说在所有可能的立体角 <math xmlns="http://www.w3.org/1998/Math/MathML"> 4 π 4\pi </math>4π 上的积分为1。
我们将在即将到来的部分中看到,将这两个组件分开将允许推导出更有效的方程。
五、快速回顾
瑞利散射方程
:指示了在方向 <math xmlns="http://www.w3.org/1998/Math/MathML"> θ \theta </math>θ上被偏转的光的比例。散射的强度取决于入射光的波长 <math xmlns="http://www.w3.org/1998/Math/MathML"> λ \lambda </math>λ。 <math xmlns="http://www.w3.org/1998/Math/MathML"> S ( λ , θ , h ) = π 2 ( n 2 − 1 ) 2 2 ρ ( h ) N 1 λ 4 ( 1 + cos 2 θ ) S \left(\lambda, \theta, h\right ) = \frac{\pi^2 \left(n^2-1 \right )^2}{2} \frac{\rho\left(h\right)}{N} \frac{1}{\lambda^4} \left(1+\cos^2\theta \right ) </math>S(λ,θ,h)=2π2(n2−1)2Nρ(h)λ41(1+cos2θ)
另外:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> S ( λ , θ , h ) = β ( λ , h ) γ ( θ ) S \left(\lambda, \theta, h\right ) = \beta \left(\lambda,h \right ) \gamma\left(\theta\right) </math>S(λ,θ,h)=β(λ,h)γ(θ)
瑞利散射系数
:指示了单次碰撞后散射的光的比例。
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> β ( λ , h ) = 8 π 3 ( n 2 − 1 ) 2 3 ρ ( h ) N 1 λ 4 \beta \left(\lambda,h \right )=\frac{8\pi^3 \left(n^2-1 \right )^2}{3} \frac{\rho\left(h\right)}{N} \frac{1}{\lambda^4} </math>β(λ,h)=38π3(n2−1)2Nρ(h)λ41
海平面处的瑞利散射系数
:等同于 <math xmlns="http://www.w3.org/1998/Math/MathML"> β ( λ , 0 ) \beta \left(\lambda,0\right ) </math>β(λ,0)。创建这个额外的系数对于推导更有效的方程非常有帮助。
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> β ( λ ) = β ( λ , 0 ) = 8 π 3 ( n 2 − 1 ) 2 3 1 N 1 λ 4 \beta \left(\lambda \right )=\beta \left(\lambda,0 \right )=\frac{8\pi^3 \left(n^2-1 \right )^2}{3} \frac{1}{N} \frac{1}{\lambda^4} </math>β(λ)=β(λ,0)=38π3(n2−1)2N1λ41
如果我们考虑粗略地对应于红色、绿色和蓝色的波长,我们会得到以下结果:
<math xmlns="http://www.w3.org/1998/Math/MathML"> β ( 680 n m ) = 0.00000519673 \beta\left(680nm\right) = 0.00000519673 </math>β(680nm)=0.00000519673
<math xmlns="http://www.w3.org/1998/Math/MathML"> β ( 550 n m ) = 0.0000121427 \beta\left(550nm\right) = 0.0000121427 </math>β(550nm)=0.0000121427
<math xmlns="http://www.w3.org/1998/Math/MathML"> β ( 440 n m ) = 0.0000296453 \beta\left(440nm\right) = 0.0000296453 </math>β(440nm)=0.0000296453
这些结果是在考虑 <math xmlns="http://www.w3.org/1998/Math/MathML"> h = 0 h=0 </math>h=0(这意味着 <math xmlns="http://www.w3.org/1998/Math/MathML"> ρ = 1 \rho=1 </math>ρ=1)时计算的。这只发生在海平面上,散射系数达到最大值。因此,它作为光线被散射的"基准"。
瑞利相位函数
:控制散射几何,指示了在特定方向上丢失的光的相对比例。系数 <math xmlns="http://www.w3.org/1998/Math/MathML"> 3 16 π \frac{3}{16\pi} </math>16π3 作为归一化因子,使单位球面上的积分为 1。
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> γ ( θ ) = 3 16 π ( 1 + cos 2 θ ) \gamma\left(\theta\right)= \frac{3}{16\pi} \left(1+\cos^2 \theta\right) </math>γ(θ)=16π3(1+cos2θ)
密度比率
:这是一个用于模拟大气密度的函数。它将在未来的帖子中正式介绍。如果你不介意数学的剧透,它被定义为:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> ρ ( h ) = e x p { − h H } \rho\left(h\right)=exp\left\{-\frac{h}{H}\right\} </math>ρ(h)=exp{−Hh}
其中 (H=8500) 米被称为尺度高度。