大气散射(一)体积大气散射

386 阅读6分钟

一、介绍

大气效应之所以难以再现,是因为天空并非固体物体。传统的渲染技术假设物体仅仅是一个空心外壳。所有的图形计算都只发生在物体表面,而不考虑内部结构。这种巨大的简化使得渲染固体物体变得非常高效。然而,某些材料的特性取决于光线能否穿透它们。半透明物体的最终外观取决于光线与其内部结构的相互作用。在大多数情况下,这种相互作用可以被非常有效地模拟,就像在Unity中的快速次表面散射教程中所看到的那样。不幸的是,如果我们想要再现一个可信的天空,情况就不同了。我们需要模拟光线穿过大气层时发生的情况,而不是仅渲染行星的“外壳”。将计算传播到对象内部被称为体积渲染,这是一个在体积渲染系列中已经广泛讨论过的主题。在那个系列中介绍的两种技术(射线行进和有有符号距离场函数)不能有效地用于模拟大气散射。本教程将介绍一种更合适的方法来渲染固体半透明物体,通常被称为体积单次散射

二、单次散射

在没有任何光线的房间里,你会期望什么都看不到。物体只有在光线反射并触及我们的眼睛时才变得可见。大多数游戏引擎(如Unity和Unreal)假设光线是“在真空中传播”的。这意味着物体是唯一能影响光线的东西。而在现实中,光线总是通过介质传播的。在我们的情况下,这个介质是我们呼吸的空气。因此,物体的外观受到光线穿过的空气量的影响。在地球表面,空气密度相对较低;它的贡献非常微小,只有当光线传播很长距离时才能真正体会到。远处的山脉与天空融为一体,尽管我们附近的物体似乎几乎不受大气散射的影响。

要复制大气散射的光学效果,第一步是了解光线如何穿过空气等介质传播。如前所述,只有当光线触及我们的眼睛时,我们才能看到东西。在3D图形的背景下,我们的眼睛就是用来渲染场景的相机。组成我们周围空气的分子可以使光线偏离穿过它们的路径。因此,它们有能力改变我们对物体的感知方式。作为一个极其简化的概念,空气中的分子可以通过两种方式影响我们的视觉。

三、外散射

空气分子与光线相互作用最明显的方式是偏折光线,改变其方向。如果一束指向摄像机的光线被偏折离开,我们就会遇到一种称为外散射的过程。

image.png 一个真实的光源可以每秒发射数以千万计的光子,每个光子有一定的概率撞击到空气分子。光线传播的介质越密集,单个光子被偏折的可能性就越大。外向散射对光线的影响程度也取决于光线传播的距离。

image.png 外向散射导致光线逐渐变暗,这取决于光线传播的距离和空气密度。

四、内散射

当光线被粒子偏折时,也可能发生将光线重新定向到摄像机的情况。这实际上是外向散射的相反过程,因此不足为奇地被称为内向散射

image.png 在某些条件下,内向散射使得能够看到不在摄像机直接视线中的光源。其最明显的光学效应是在光源周围形成光晕。这是由于摄像机接收到来自同一光源的直接和间接光线,从而实际上增加了接收到的光子数量所导致的。

image.png

五、体积单次散射

一束光线可以被任意次数偏折。这意味着光线在到达摄像机之前可以走非常复杂的路径。这带来了重大挑战,因为以高保真度渲染半透明材料需要模拟每个光线的路径。这就是所谓的光线追踪,目前在实时渲染方面计算成本过高。本教程中介绍的技术称为单次散射,因为它仅考虑了光线的一个散射事件。稍后我们将看到,这样的简化仍然可以以较低的成本获得逼真的结果,而真实的光线追踪则需要更高的成本。

渲染逼真天空的关键是模拟光线穿过行星大气层时发生的情况。下面的图示显示了一个摄像机,从一个行星的视角观察。这种渲染技术的基本思想是计算从A到B的光线受到散射影响的方式。这意味着计算外向散射和内向散射对朝向摄像机传播的光的影响。如前所讨论的,我们经历了由于外向散射导致的衰减。在线段AB上的每个点P上存在的光的量有一小部分可能会被偏折离开摄像机。

image.png 要正确地考虑每个点P处发生了多少外向散射,我们首先需要知道在第一次光照射到P时P处有多少光。假设只有一个恒星照亮了这个行星,P接收到的所有光必须来自太阳。其中一部分光将被内向散射,意外地偏折到摄像机方向:

image.png 这两个步骤足以近似大气中可观察到的大多数效应。然而,由于从C到P穿过大气的过程中,P从太阳接收到的光的数量本身也会受到外向散射的影响,这使得情况变得更加复杂。

image.png

总结一下:

  • 摄像机的视线从A进入大气,从B退出; 作为近似,我们考虑了每个点PABP \in\overline{AB} 中发生的外向散射和内向散射的贡献;
  • P接收到的光来自太阳;
  • P接收到的光受到外向散射的影响,因为它穿过大气 CP\overline{CP}
  • P接收到的部分光受到内向散射的影响,使其朝向摄像机方向;
  • 从P朝向摄像机的一部分光受到外向散射的影响,并偏离了视线。