您想找什么?
Technology

《铁匠》中的大气散射

TORBJORN LAEDRE / UNITY TECHNOLOGIESContributor
May 28, 2015
散射头
为方便起见,此网页已进行机器翻译。我们无法保证翻译内容的准确性或可靠性。如果您对翻译内容的准确性有疑问,请参阅此网页的官方英文版本。

在《The Blacksmith》的规划阶段早期,我们就知道我们需要一种大气散射解决方案,它能比内置雾选项提供给我们更多的细节和控制力。特别是,我们想强调电影中一些更广阔的镜头中的空中透视效果。

大气散射图像

当我们开始为该项目寻找散射解决方案时,我们最初实施并试验了 Tomoyuki Nishita[1] 的几篇论文中提出的模拟模型。经过一些不同镜头的实验和原型设计后,我们最终决定,最好瞄准一个可以对短片中的每个镜头进行广泛的艺术控制的模型。我们想要一个解决方案,可以让我们接近物理模型的主要元素,但也允许我们在必要时打破任何和所有规则。我们还需要解决方案不要对短片的运行时性能产生巨大影响,并且目标是能够按顶点而不是按像素进行大部分计算。

我们设定了一个目标,尝试从物理模型中模拟瑞利散射和米氏散射的综合效应。我们还添加了第三个元素,代表各种类型的低空散射效应;统称为高度散射。与基于物理的模型的另一个主要区别是,我们决定继续使用HDR天空纹理,而不是程序化生成天空和云彩。这样做的明显缺点是,设置诸如动态时间之类的东西(对于《铁匠》我们不需要)变得有点复杂,而主要优点是保留对天空的完全艺术控制。

瑞利散射


大气中阳光的瑞利散射是造成白天天空呈现亮蓝色以及日出和日落时太阳和地平线变红的原因。

在我们的模拟中,我们忽略了太阳本身,而只注重模拟阳光入射和出射散射产生的颜色和消光。可以将太阳的视觉表现添加到天空纹理中,作为米氏散射的一部分,作为太阳耀斑精灵,或这些的任意组合。从最简单的核心来说,瑞利散射的密度可以归结为由瑞利相位函数调制的荣耀指数函数。然而,我们对输入的数据和从中提取的数据还有一些额外的控制权。由于我们没有模拟穿过大气的不同波长的光,因此我们计算的密度是标量值。我们使用HDR色带来适应地平线和天顶处散射光的不同色调,并使用距离感知函数来组成最终色调。

瑞利散射示例
不同散射配置中的瑞利贡献。

米氏散射

阳光在大气中发生米氏散射,造成太阳周围出现明亮的光晕,云层呈现灰白色,污染严重的城市上空出现雾霾。与以几乎均匀的形状散射光的瑞利散射相反,米氏散射具有强烈的前向性。

在我们的模拟中,我们让米氏散射主要代表太阳周围的雾霾和光晕。因此,我们几乎总是对其进行着色,以弥补瑞利模拟忽略太阳的事实。从技术上讲,我们的瑞利函数和米氏函数非常相似,其显著区别在于应用于输出的相位函数。与许多其他实现一样,我们使用 Henyey-Greenstein 散射函数来控制米氏散射的各向异性(或前向方向性)。

散射 mie 的示例
不同散射配置中的米氏贡献。

鉴于我们在每个模拟中包含的内容都具有一定的“自由度”,阅读过研究论文的人可能会嘲笑我们对名称的选择。我们很早就发现,人们通常在描述“天空散射”时使用瑞利这个名称,而在描述“太阳霾”时使用米氏这个名称,因此,即使在实施模型从物理模型简化之后,我们也决定继续使用这些名称。

高度散射

高度散射元素代表各种低空散射效应的混合,包括辐射雾、地面霾和低空云。

我们对高度散射的实现相当简单;高度密度是根据定义的海平面和高度衰减来计算的。然后,这会缩放基于距离的指数密度,并将整个事物染成所需的颜色。

散射高度图像
不同散射配置中的高度贡献。

散射遮挡

由于我们的散射贡献主要是由阳光向观察者散射、远离观察者散射或在到达观察者途中被粒子吸收引起的,因此如果物体阻挡了太阳光,那么发生某些事情就应该是有道理的。

为了处理这种情况,我们通过定向光的级联阴影图进行光线行进,并在缩小的屏幕外缓冲区中累积沿光线的遮挡量。将散射应用于输出像素时,我们使用边缘感知过滤器对该遮挡图进行上采样,并将其用于组成像素的最终颜色。在这个组合阶段我们遇到了一些麻烦;由于我们的解决方案仅仅是单散射,我们不能直接屏蔽掉所有的散射光,因为那样会给我们留下非常黑暗和不自然的图像。我们也不想扩展解决方案来处理更复杂和更昂贵的多重散射。最后,我们找到的解决方案是发明一种“间接因素”,您可以明确指定一定比例的散射作为间接而不是直接处理。

散射遮挡
不同散射配置中的无偏遮挡。

训练环境总装

现在剩下的就是组合不同的元素来组成最终的图像。将瑞利、米氏和高度元素加在一起,我们就可以开始完美地组合不同的散射颜色。

散点图
结合瑞利散射、米氏散射和高度散射。

接下来,我们需要确保充分利用遮挡缓冲区。我们使用不同的强度参数来调整直接、间接、云和天空散射的遮挡量。

遮挡散射
组合散射和遮挡散射。

最后,剩下的事情就是将散射与渲染图像混合。我们通过总累积消光使透射图像变暗,并通过总累积散射使透射图像变亮。这产生了我们示例场景的最终构图。

散射最终构图
最终作品。

我们已经将大气散射提取到一个单独的项目中,您可以 从 Asset Store 获取该项目。除了构成解决方案的所有代码和着色器之外,该项目还包含用于生成本文中图像的所有配置预设。不要忘记检查附带的自述文件以了解不同配置选项的含义的详细信息。

参考:
[1]:考虑大气散射的地球显示
http://nishitalab.org/user/nis/cdrom/sig93_nis.pdf

[1]:考虑多重散射的天空颜色显示方法
http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.75.5595&rep=rep1&type=pdf

[1]:考虑多重各向异性散射和天空光的云显示
http://www.researchgate.net/publication/220720838_Display_of_Clouds_Taking_into_Account_Multiple_Anisotropic_Scattering_and_Sky_Light

包中的HDR天空来自 NoEmotionHDRs (Peter Sanitra) /版权归 CC BY-ND 4.0 所有。 无需修改即可使用。