【MODO】最通俗易懂的全局光照(间接光照)

835 阅读10分钟

“我报名参加金石计划1期挑战——瓜分10万奖池,这是我的第8篇文章,点击查看活动详情

技术有点啰嗦

全局光照(间接光照)理论基础

传统上,3D 渲染应用程序使用 直接光源 来照亮场景,将定义各种虚拟光,如聚光灯或点光,并可以 从它们的原点追踪光线 。根据它们的位置,很容易计算出一个表面是被照亮了还是在阴影中。这种渲染方法是 快速准确 的,但没有产生最真实的结果。现实世界中的光不是静止的,而是在环境中跳跃,同时吸收和反射每条光线遇到的颜色。一个绿色的球放在白色的墙壁旁边,当光线照射时,在两个表面之间会产生了一些微妙的颜色; 光线越亮,渗色效果越明显。全局照明是一种模拟光上述行为的手段,能更容易产生比单单依赖直接光源所获得的更真实的结果。

Modo 允许用户在任何场景中使用直接和间接光源。这两个模型分别计算,它们各自的乘积相加得到最终的着色结果。每种模型都有特定的优点(和缺点)。当明智地将它们结合在一起使用,并且搭配一定数量的控件,你就可以同时优化渲染图像的速度和质量。

为了充分理解间接照明设置,首先了解间接照明的技术过程是 至关重要的。虽然直观地想象,光来自 3D 光或发光表面,传播到各个表面,然后在房间中反弹,但间接照明的实际渲染过程是 完全相反的。在对表面进行评估时,光线会 从表面随机向外投射,并在它们撞击场景中的其他表面时进行评估。这些评估的总和 影响了原始表面的颜色和亮度。

为了更精确地了解表面上某一点的间接照度是如何估计的,可以想象一个 仅有上半部分的透明球体 的放在表面上,同时 该点的表面法线穿过它的北极。光线从表面点通过(由经纬度网格线组成的)每个单元内的随机位置发射,并且每个单元一条光线。这些射线发射出去,击中其他表面或远处的环境,它们看到的平均颜色是 间接辐照度indirect irradiance)估算值 (irradiance入射光 的专业术语)。

现在想象一下,我们需要在 月光照耀的夜晚 给一个表面着色; 整个环境几乎都是黑色的,除了一个集中的明亮区域 ——— 月亮。表面上的每个着色点都发送 如上所述 的射线。对某些点来说,可能有 两束 光射向明亮的区域,而只有 一束 光射向其他点,其余的都是黑色的。鉴于有些点的 辐照度 是其他点的 两倍,所以可以预测,如果开启 辐照度缓存Irradiance Cache),那么表面可能会看起来很斑驳(如果关闭的话,表面会呈颗粒状)。然而,如果我们进一步将 透明半球 细分得更细(也就是说,使用更多的光线),相邻表面点之间的命中和失误数量就会变得 更加一致,从而使着色变得 平滑

虽然 Modo 中的 间接照明 是基于这种 半球采样 技术,但使用这些样本有 两种 非常不同的方法。默认 的方法使用一种称为 辐照度缓存 (IC)的技术。这种技术 背后的概念 是,通过利用 数量较少的更精确 的样本,并在它们之间混合,您可以在更短的时间内获得可观质量的图像,而不是对 每个质量较低 的像素采样,后者通常会导致图像颗粒或噪声。当禁用 辐照度缓存 时,Modo 退回到为图像中的每个像素生成一个半球形着色采样(蒙特卡罗方法)。因此 必须小心 使用光线数量,因为这个数字会乘以图像中的数百万像素。随着激活 辐照度缓存Modo 在策略位置上智能采样场景,然后在它们之间插入一个更平滑的整体最终帧。

考虑 蒙特卡罗辐照度缓存 的最简单的方法是,蒙特卡罗 方法在 每个像素位置使用较低质量(较少射线) 的样本,而 IC 使用 更少的、高质量(更多射线) 的样本,并将它们混合在一起。因此,当样本在蒙特卡洛不够精确时,相邻像素之间会有显著的差异,这在视觉上表现为 颗粒。当使用 IC 时,方差在样本间分散,这在视觉上产生 斑点。在蒙特卡洛技术中,你可以通过 增加每个像素的射线数量 来解决这个问题。这可能导致渲染时间急剧增加。IC 提供了几种减少瑕疵的方法,包括增加射线的数量添加超级采样,以及增加创建混合所需的样本数量(称为 Interpolation Values)。

在所有的射线都被用于特定的辐照度评估后,该功能将查看半球内的每个单元的结果射线颜色,然后将额外的射线发送到与相邻单元差异很大的单元中,对环境中对比度较高的区域进行更详细的观察,从而获得更准确的估计。目前大约有 25% 多的射线被发射,所以当设置为 100 条射线时,你实际上得到 125 条射线,但结果比你只使用 125 条没有超采样的设置要好。这是因为射线的方向更重要。

image.png

打个不太恰当的比方:

  • 蒙特卡洛用的全民兵侦察;
  • IC 挑选的都是高级特种侦察兵(更懂得选择侦察路线)

现在你已经有了基本概念的概述,下面的定义有更多的上下文信息,使你能够在使用间接照明时能更有效地平衡你的场景的性能/质量

间接采样数(Indirect Samples)

该值表示在使用 蒙特卡洛 间接照明模型(禁用 辐照度缓存)时,为图像中的每个像素采样的数量。增加这个值会以更长的渲染时间为代价获得更高的质量

全局照明-蒙特卡洛(IC 禁用),4 次反弹,射线阈值 0%

image.png

跳跃数(Bounces)

默认值1 意味着使用单个反弹来计算表面环境对其的影响。这比多反射解决方案 更不准确,因为在现实世界中,光子在照亮环境时到处反射。然而,用更少的弹跳可以换取 更高的性能。通过增加间接反弹的次数,间接射线从初始表面发射,并从它们击中的第一个表面反弹,然后继续移动和撞击表面,直到达到最大反弹次数。

间接反弹(IC 启用),射线阈值 0%

image.png

Modo 中,光线评估的工作方式可以被认为是图层。当照明有多个弹跳(在 Indirect Bounces 控件中定义了多个弹跳)时,每个弹跳都是自己的层。Irradiance Usage 选项允许你控制在渲染过程中哪一层射线上使用 Irradiance Caching,哪一层使用蒙特卡洛。使用这些选项的原因是,允许最强的影响射线(第一次反弹)使用更精确的蒙特卡罗方法,并将其与后续 IC 评估的更快和更平滑的结果相混合。为了模仿 Modo 701 和更早的结果,使用 First and Second Bounce 选项。

  • First Bounce Only:只有第一次从相机向外反弹使用 IC,任何后续反弹使用 蒙特卡洛
  • Second Bounce Only:从相机第一次向外反弹使用 蒙特卡洛,然后第二次反弹为 IC ,并为任何后续反弹改回 蒙特卡洛
  • First and Second Bounce:第一和第二反弹都使用 IC,后续反弹使用 蒙特卡洛image.png

传播范围(Range)

这个值决定了间接射线在终止前可以 传播的距离。在由于间接范围值而终止射线的情况下,其假定射线最终击中的是环境背景,因此将该值返回给着色引擎。这是一种 非常有用的优化 渲染时间的方法。减少间接范围通常可以提高渲染速度。

以下图片显示间接范围(IC 在 1米 立方体内启用,默认环境),射线阈值 0% :

image.png

间接 SSS

当渲染使用次表面散射(SSS)的表面时,您可以选择场景中的间接照明如何影响这些表面。在选择 Direct Only 时,Modo 不使用任何间接(反弹)照明,而是只根据场景内的直接照明计算 SSS,即远处的光、聚光灯、点光等。这种模式在很多情况下是有用的,因为全局照明对 SSS 的影响通常是相当微妙的。然而,在场景中没有直接光的情况下,例如完全由 基于图像的照明(HDRI) 照明的场景,您需要选择 Indirect Affects SSSBoth,以查看任何给定表面的 SSS 效果。

  • Indirect Affects SSS:当选择这个选项时,Modo 在你的场景中使用任何全局照明,以及直接照明来计算物体表面的次表面散射效应。

  • SSS Affects Indirect:当选择这个选项时,Modo 计算反射的间接光,考虑到任何给定表面的次表面散射效应。

  • Both:该设置允许全局照明 影响 次表面散射,也允许次表面散射 影响 间接照明计算。这个设置是渲染 最密集 的。

  • Indirect Volumetrics:启用此复选框将指导 Modo 在计算全局照度时考虑 体积照明 效果。

环境重要采样

重要采样是一个考虑到 HDR 图像亮度 的特性,用于基于图像的照明。图像中 较亮的区域 对照明结果的影响更大,因此当启用时,样本集中在这些较亮的区域周围,产生更准确、更平滑的结果,使用更少的 IC 射线(这意味着更快的渲染)。这个特性基本上使得 应用环境 HDRI 的模糊低分辨率副本的这个过程 变得没有必要。

重要性采样轻微地改变了最终渲染图像的外观,最明显的是产生了更精确的阴影,这可能是或不可能是一个理想的结果。

环境采样数(Environment Samples)

确定用于全局照明的环境的采样数量。更多细节的环境受益于额外的采样,增加最终渲染的准确性,但也增加了渲染时间。在低分辨率或低细节的环境中,您可以将这个值保持在低水平,以减少渲染时间。

image.png

左边的图像禁用了重要性采样,并使用 HDR 图像作为带有明亮聚光灯(太阳)的环境照明。使用 128 条 IC 射线,通过将 IC 射线增加 8 倍至 1024 条,不希望出现的斑点在中间图像中明显被消除了。第三张图像启用默认值的 Importance Sampling,并将 IC 射线重置为 128 射线。注意清晰的阴影且完全没有任何斑点,产生了优越的结果,只比左边的图像渲染时间稍长一些。