为什么要做这种事情??

现在 AIGC 的技术越来越成熟了,以至于各种天象(云、或者不精确的大气光学现象)的合成效果越来越逼真了,即使是专业人士也很容易在没有防备的情况下被骗。

冰晕作为一种有精确图形的、可以基于规则验证天象,暂时还没有被生成式 AI 彻底攻破(尽管这只是时间问题)。所以我就想啊,如果在稍微有些基础知识的情况下,是否能借助现有技术,合成非常真实的冰晕,以至于专业人士都看不出来呢?

伪造锥晶幻日

伪造的锥晶幻日,原图由本人拍摄于2024年10月没有任何锥晶

虽然这种想法很像在搞破坏,但是不要觉得我们这么做一定出于什么 malicious intentions。合成现实中不存在的冰晕图片实际上有一定的积极的。不管是 HaloSim / HaloRay / HaloPoint 还是晕现这些理想化的模拟,距离真实的观测中看到的冰晕还是有 gap 的:

  • 直观感受冰晶的不均匀带来的效果。在所有的模拟中冰晶的空间分布基本是均匀的,但现实生活中(尤其是高云冰晕)冰晶一定是不均匀的:冰晶的光学质量以及光学厚度都会发生在空间上大幅度变化。这一点本身没有什么,但有时候通过自己去合成冰晕,才能感性上体会到有时候一小块高质量卷云对应的全天冰晕是多么震撼。

  • 直观体会一些暗弱的冰晕是如何淹没在杂乱的散射光以及云纹中的。举个例子,偕日弧相对于上凹 Parry 来说少见得多,我们都知道是因为一般亮度不够。如多我们自己手动调整冰晕在云/钻石尘基底中的亮度,可以直观看到暗弱的冰晕是怎么出现和消失的。

  • 合成冰晕的过程还能让我们反推冰晶的典型大小。理想化模拟得到的冰晕都是锐利的、颜色分离较为清晰的。模拟中没有考虑冰晶的衍射的效应,纯粹按照几何光学的方式模拟光线的传播。衍射会导致冰晶折射反射的阳光变得更发散,形成的冰晕更“奶糊”。这种效应是如此的常见与明显,以至于直接将这种模拟图与天空背景合成冰晕会得到不真实的结果。在让结果变得更真实的动机驱动下,通过调整合成参数,让冰晕变得更加“符合经验”,这个过程可以反推典型情况下形成冰晕的冰晶尺度。

而且最重要的是,这有一定的经济价值。比如说,你现在想要写一些关于冰晕的文章但是没有图片的版权,你就可以自己做对不对(但一定要说明图片来自于合成)。

总的来看,我们还是在给社会做贡献的。

需要准备什么

由于现在 AI 从零生成冰晕的时候,无法匹配冰晕特有的精确物理约束,因此要合成非常仿真的冰晕图片,我们需要能生成 ground truth 冰晕的模拟器,以及另一些东西:

  • 塑料卷云背景图;
  • 理想化冰晕模拟得到的模拟图;
  • 对齐上述两者的相机参数,例如 azimuth、pitch、FOV、投影方式等等;

然后我们就可以开干了。

先等一下,学点理论

我们先看一些计算机图形学的内容,这对于我们的接下来具体操作很有启发(以下内容 AI 生成,我检查过了,写的大致正确):

在模拟体积云的时候,需要计算的是从相机(或眼睛)出发的射线,穿过云层到达该采样点,然后该点接收和散射的光最终到达相机的光亮度,作为最终的亮度。

想象一下,站在地面上,看向天空中的一朵云。你的眼睛(或相机)接收到的光线,是沿着“视线射线”与云体相互作用的结果。计算这个亮度,可以分解为以下几个关键步骤:

1. 起点与方向

  • 从相机位置出发,指向你要计算的屏幕像素所对应的世界空间方向,需要计算沿这条射线最终到达相机的总光量

2. 光线步进与采样

  • 我们不会直接计算一个复杂的积分,而是将这条穿过云的射线切分成很多小段(比如100-200段)。
  • 在每个采样点上,我们需要评估当地的云属性并计算它对最终亮度的贡献。

ray marching

3. 单点贡献的计算(核心)

在每个采样点,我们需要知道两件事:

  • 光照如何到达这里(In-Scattering):阳光不是直接照到我们眼睛的,而是先照到云里的微小球状水滴(粒子)上,然后被散射。到达当前采样点的光,是来自各个方向的光(主要是太阳方向)被散射到当前视线方向的结果。这就是 “散射进入”

    • 关键1:这通常简化为计算从当前点到太阳的次级射线。如果这条次级射线没有被云完全遮挡(考虑云的密度),那么太阳光就能到达当前点,并被散射向你。

    • 关键2:散射进入的强度与太阳光线与观察视线的夹角有关,因此也叫作散射的角度函数

  • 光线如何从这里离开(Extinction):从当前采样点出发、指向相机的光线,在“回家”的路上也会被云中的其他粒子吸收或散射到其他方向,导致衰减。这就是 “消光”。密度越大的地方,消光越强,后面点的贡献就越难传到相机。

简单公式:

当前点贡献的亮度 ≈
(到达该点的光照强度) * (该点的散射系数(与散射角度有关的散射角度函数)) * (该点光回家路上的透光率)
  • 到达该点的光照强度:考虑了太阳光穿透云层到达此点的衰减。
  • 该点的散射系数:由云的密度决定。密度图(通常是3D噪声纹理)在这里起关键作用,它定义了云在哪里厚、在哪里薄。
  • 该点光回家路上的透光率:从当前点回望相机,之间云层的“透明程度”。

4. 沿视线累积(合成)

  • 从射线进入云体的近点开始,到穿出云体的远点结束,遍历所有采样点。
  • 采用 “从后向前”或“从前向后”的Alpha混合思想,将每个采样点的贡献累加起来。
  • 最终得到的颜色和亮度,就是该像素上云的最终外观。

这意味着什么

这个式子是最重要的:

当前点贡献的亮度 ≈
(到达该点的光照强度) * (该点的散射系数(与散射角度有关的散射角度函数)) * (该点光回家路上的透光率)

我们在合成冰晕的时候,其实很大程度上就是在 tamper with 这个散射角度函数。对于灰白色的塑料卷云来说,它对阳光的散射方式较为混乱,可能接近米散射的角度函数,散射出来的阳光角分布相对均匀。对于高质量卷云而言,散射角度函数会变得复杂而精妙:在一些特定的,有时候甚至可以解析的角度范围上,散射强度会明显偏高(或偏低),形成肉眼可见的光弧、光点、光柱、晕圈等等。

scattering

因此,我们的合成流程也很明确了,我们就是要根据已有的素材模拟上面这个 ray marching 的过程。

  • 塑料卷云背景图同时承载了无规律散射角度函数冰晶质量空间分布两个信息;
  • 模拟的理想化冰晕图像,提供了光学质量最好的冰晶的散射角度函数图形
  • 我们需要把一部分的无规律散射角度函数去除,再在冰晶质量与光学厚度较合适的区域叠加光学质量最好的冰晶的散射角度函数图形,合成最终的冰晕图像。

然后再手动对一些理想化模拟无法实现的参数进行调整,即可完成整个基本流程。非常的直白。

Share on: TwitterFacebookEmail


sdc Avatar sdc In charge of the website

Related Posts


Published

Category

博客

Tags

Contact