用于生产级遮挡感知多光源采样与体积散射的 Cache Points
Yining Karl Li(华特迪士尼动画工作室,美国伯班克)、Peter Kutz∗(Adobe,美国旧金山)、Charlotte Zhu(华特迪士尼动画工作室,美国伯班克)、Wei-Feng Wayne Huang∗(NVIDIA,美国洛杉矶)、Gregory Nichols∗(Latitude AI,美国匹兹堡)、David Adler(华特迪士尼动画工作室,美国伯班克)、Brent Burley(华特迪士尼动画工作室,美国伯班克)、Daniel Teece(华特迪士尼动画工作室,美国伯班克)
摘要
一个将渲染器定义为生产级渲染器的标志性能力,是其能够扩展以处理极端复杂的场景,包括由大量光源投射的复杂光照。在本文中,我们提出了 Cache Points,这是迪士尼 Hyperion Renderer 用于在包含多达数百万个光源的场景中执行直接光照的高效无偏重要性采样的系统。我们的 cache points 系统包含许多新颖特性:我们在将进行光源采样的点上构建空间数据结构,而不是在光源本身上构建;我们在线学习遮挡,并将其纳入我们的重要性采样分布中;我们还加速了困难的体积散射情况下的采样。
在过去十年中,我们的 cache points 系统已在华特迪士尼动画工作室制作的每一部 CG 长片和动画短片中得到广泛的生产应用,使艺术家能够设计光照环境而无需担心复杂性。在本文中,我们将概述 cache points 系统的构建方式、工作原理、对生产光照和艺术家工作流程的影响,以及它在迪士尼动画生产渲染未来中的角色。
CCS 概念:计算方法学 → 渲染;光线追踪。
关键词:path tracing, global illumination, light selection, importance sampling, volume rendering
ACM 引用格式:Yining Karl Li, Charlotte Zhu, Gregory Nichols, Peter Kutz, Wei-Feng Wayne Huang, David Adler, Brent Burley, and Daniel Teece. 2024. Cache Points for Production-Scale Occlusion-Aware Many-Lights Sampling and Volumetric Scattering. In The Digital Production Symposium (DigiPro ‘24), July 27, 2024, Denver, CO, USA. ACM, New York, NY, USA, 19 pages. https://doi.org/10.1145/3665320.3670993
1 引言
生产渲染中的一个主要挑战,是在包含从少量到数十万甚至数百万个光源的场景中进行光源采样。此外,任何特定制作中出现的光照场景类型往往是不可预测的。Hyperion 设计的一个关键原则是强调简单性而非灵活性(Burley et al. 2017):我们尽量不给用户增加非艺术性控制的负担。根据这一原则,我们更倾向于让系统对尽可能多的生产场景自动保持足够的鲁棒性。在本文中,我们深入描述了用于引导生产场景中直接光照采样的系统——从最简单到最复杂的光照场景。我们的系统 cache points 为光源采样权重构建局部最优估计,并纳入了用于局部光源可见性估计的在线学习度量。我们的系统能够:(1) 将解析光源、自发光几何体和自发光体积的局部估计组合到单一系统中;(2) 为表面点和参与介质内部的点提供无偏的直接光照采样引导。此外,我们还将系统扩展用于参与介质中体积内散射的重要性采样。虽然我们在之前的工作中曾提及用 cache points 系统解决多光源采样问题(Burley et al. 2018; Fong et al. 2017; Nichols and Eisenacher 2015),也曾在高层面上描述过用于体积散射的 cache points(Huang et al. 2021),但在本工作中,我们将对这些方法进行详细、深入的介绍,并将我们的技术作为整体来描述(第 3、4 节),提供真实世界的生产案例研究(第 5 节),并讨论潜在的未来改进(第 6 节)。
2 动机与相关工作
动机。 生产渲染器经常必须处理光照复杂度极高的场景。迪士尼 Hyperion Renderer 最初是为《超能陆战队》的制作而编写的,其中的夜景城市场景包含多达五十万个小而亮的定向光源(图 2)。后来的制作进一步提高了复杂度,加入了自发光网格几何体和自发光体积——如果把每个自发光网格中的每个三角形和每个自发光体积都单独计算,场景中就有数百万个离散光源(图 1)。虽然通过下一事件估计(next event estimation)对单个解析光源的直接光照进行采样、并通过多重重要性采样(multiple importance sampling)(Veach 1998)将直接光照样本与 BSDF 样本组合,如今已被充分理解,但从潜在的数百万个光源中自动选择要采样的光源,仍然是一个活跃的研究领域。
手动光源分组。 管理光照复杂性的一种可能解决方案,是让艺术家手动从场景中剔除贡献低的光源,或要求艺术家运行试点渲染、收集光源使用统计信息,然后将剔除构建到生产流程中(Vavilala 2019)。然而,本着寻求简单而高效的用户工作流程的精神,我们希望避免任何需要手动干预、或在艺术家专注于创作工作之前增加管线复杂度的方案。相反,我们寻求在渲染器内部自动处理多光源场景的解决方案。
层次光源树。 用于光源选择的层次树数据结构,是当今多光源问题最常用的解决方案之一(Fascione et al. 2018; Georgiev et al. 2018; Gospodnetić 2017; Keller et al. 2017; Kulla et al. 2018; Pharr et al. 2023)。Kulla 等人(2018)使用的特定层次光源树变体由 Conty 等人(2018)进一步详细描述。虽然我们确实使用层次光源树方法来聚类单个自发光网格内的三角形,但我们发现基于层次结构的方法在全局多光源采样的某些用例中存在困难。具体来说,我们注意到基于窄而高方向性的 IES 配置文件的光源对光源树来说很难处理;将复杂的遮挡信息纳入光源树也被证明是棘手的。总体而言,我们认为层次树数据结构与我们的 cache points 是不同但大体上互补的方法;我们将在第 5.2.2 节进一步讨论。
光子映射(Photon Mapping)。 我们 cache points 数据结构的核心,由大量散布在场景世界空间中的点组成,这些点被放置在 KD 树中以进行快速最近邻查找。从高层次来看,这种数据结构与光子映射非常相似(Jensen 1996, 2001)。然而,我们的 cache points 在数据结构的构建方式、存储内容和使用方式上都不同于光子映射。光子映射通过从光源进行前向光线追踪,将光子放置在场景各处;而我们的 cache points 则通过在表面上采样点与从相机进行后向路径追踪相结合的方式放置在场景各处。我们在每个点存储累积分布函数(CDF)的方法与 Jensen(1995)有相似之处;然而,我们存储的不是用于引导间接照明重要性采样的粗略辐照度近似,而是用于多光源采样的高质量直接光照估计。Hyperion 包含一个自适应光子映射系统(Burley et al. 2018);我们将在第 6 节讨论光子映射与 cache points 如何潜在地相互集成。
VPL。 多光源采样问题历史上也曾作为虚拟点光源(VPL)方法的一部分被广泛研究(Dachsbacher et al. 2014)。VPL 方法通过将照明离散为路径顶点处的大量虚拟点光源来解决间接照明问题;然后必须对这些点光源的贡献求和。Lightcuts(Walter et al. 2005)及其他相关变体(Davidovič et al. 2012; Pantaleoni 2019)关注的正是如何不必遍历每个点光源即可完成求和。与 VPL 方法非常相似,我们方法的核心数据结构也是部分由路径顶点生成的非结构化点集合;但除此之外,我们认为我们关注的问题与 VPL 文献是正交的。我们关注的不是从各个光源收集照明,而是从大量候选光源中选择一个光源进行下一事件估计。
学习技术。 我们的方法在高层面上与 Vevoda 等人后来的工作(2018)非常相似,该工作扩展自 Vevoda et al.(2016)。他们同样使用学习技术来推导纳入可见性信息的光源选择概率。然而,他们方法的细节与我们的大不相同,包括他们使用光源层次结构作为底层数据结构,而我们使用非结构化点。我们的方法可能还与 Nichols(2016)在高层面上有相似之处,但由于其方法缺乏足够的细节信息,我们无法进行更彻底的比较。
ReSTIR。 最近,基于储层的时空重要性重采样(reservoir-based spatiotemporal importance resampling,ReSTIR)(Bitterli et al. 2020)研究非常活跃。ReSTIR 系列技术(Lin et al. 2022; Wyman et al. 2023)建立在重采样重要性采样(Talbot et al. 2005)之上,基于加权储层采样(Chao 1982),通过在空间和时间上共享样本快速构建候选样本池并从中重采样光源,从而在交互式 GPU 光线追踪环境中实现对极复杂直接光照场景的快速高效采样。ReSTIR 依赖于储层采样的初始候选生成策略;Bokansky 等人(2021)和 Tokuyoshi 等人(2021)聚焦于这个问题。另一项与 ReSTIR 可比的近期工作是 Dittebrandt 等人(2023)。我们认为我们的方法可能与 ReSTIR 及类似方法互补:如果我们的方法被改造为渐进格式,它可以作为初始候选生成策略,尽管还需要为动态光源做额外考虑。
路径引导。 路径引导技术,如 OLPMM(Vorba et al. 2014)、Practical Path Guiding(Müller 2019; Müller et al. 2017)、Zero-Variance Random Walk Guiding(Herholz et al. 2019)等(Guo et al. 2018; Herholz et al. 2016; Rath et al. 2020; Ruppert et al. 2020; Vorba et al. 2020),都依赖于在在线过程中学习整个场景的照明信息,并构建某种空间加速结构的变体来引导间接照明的采样。路径引导技术与多光源采样技术的区别在于:路径引导关注间接照明,而多光源采样技术关注直接照明;通常二者正交但互补。在 Hyperion 中,我们组合使用 cache points 系统处理直接照明,并可选用 Practical Path Guiding 处理间接照明。
3 用于多光源采样的 Cache Points
Cache points 系统始于一个简单的观察:如果计算时间和内存不是问题,那么理论上最佳的灯光选择策略(在最小化噪声方面)将是:针对每个路径顶点,估计每一个光源的贡献并考虑遮挡,然后从所有这些估计中构建一个单一的概率分布,从中抽取一个光源进行采样。我们将这种理论上最佳的策略称为局部最优灯光选择。在实践中,除了最简单的场景外,这种方法由于所需的计算时间而不可行;在《超能陆战队》上的早期测试使用这种方法产生了噪声水平极低的渲染结果,但渲染时间被灯光选择所主导。此外,在为每个路径顶点构建局部最优灯光选择策略时考虑遮挡,意味着每个路径顶点所需的计算时间可能高度可变;在灯光数量多且遮挡复杂的情况下,计算时间可能比简单策略高出几个数量级(如图 1 所示),而在其他情况下,计算时间可能只是简单策略的较小倍数(如图 4 所示)。
我们的系统并非在每个路径顶点构建完美的局部最优灯光采样分布,而是专注于在一个稀疏的、基于点的数据结构中缓存和重用局部灯光选择信息。从概念上讲,我们的方法可以被认为是对完美的局部最优灯光采样分布进行有损压缩。由于我们将此分布用于采样而非直接评估直接光照项,因此使用局部最优灯光采样分布的近似结果是无偏的,只是以增加噪声为代价,换取更少的计算工作量和内存使用。因此,我们的目标是在尽可能接近完美采样分布质量的同时,尽可能减少计算工作量和内存使用。
3.1 构建和初始化缓存点数据结构
构建并初始化缓存点系统通过以下步骤进行:
- 生成一组初始的候选空间位置,用于放置缓存点;
- 合并空间上相似的候选位置;
- 为每个缓存点构建光照分布;
- 合并具有相似光照分布的相邻缓存点;
- 在缓存点之间模糊光照分布。
在本节中,我们将详细描述这些步骤中的每一步。
3.1.1 初始候选点生成
我们的系统首先在场景中所有物体的各自包围盒内随机分布生成一组初始的 100,000 个候选点。候选点按包围盒的体积比例分布。注意,我们不会在那些不进行光照采样的物体的包围盒中放置候选点,例如面光源或具有零反射率的物体。然后,我们从相机出发追踪少量 pilot 路径穿过场景,并从这些 pilot 路径中随机选择路径顶点子集;额外的候选点被放置在这些路径顶点上。这包括进入并在体积中散射的路径。
为了确保缓存点系统将使用的内存量有一个固定上限,我们将从 pilot 路径顶点生成的候选点数量限制在 1,000,000。这种策略为我们提供了表面上的点与分布在空空间中的点的良好组合,以考虑参与介质。
如果我们的初始播种过程生成的缓存点少于 10 个,我们就不再继续后续的缓存点构建过程,而是简单地回退到为每个路径顶点计算完美的局部最优光照分布。
在进一步进行之前,我们对所有这些最初最多 110 万个候选点进行空间排序,并为每个候选点分配一个索引。然后,我们将候选点放入一个初始 KD 树中,这使我们能够执行最近邻查找,以将候选点集修剪为我们最终要在其上构建光照分布的点集。接下来,我们使用两遍方法来修剪候选点集:第一遍在我们构建任何光照分布之前进行,第二遍在我们为通过第一遍的每个点构建了光照分布之后进行。
3.1.2 合并空间相似的点
在第一遍修剪中,我们合并那些落在已有点最小半径内的点。我们的最小半径启发式方法如下:对于每个候选点,我们使用 kNN 搜索在 1e-5 单位半径内找到 20 个最近邻点,并将这些点合并为一个存活的候选点。具体做法是:首先执行一个并行循环,为每个点找到其 20 个最近邻点,然后找到其中索引值最低的点;除具有最低索引的点外,所有点都被原子地标记为删除。接下来,我们执行一个串行循环,移除所有标记为删除的点,并用存活的点重建 KD 树。在此步骤中使用 20 作为邻居数量有些随意;根据经验,这个数字在平衡查找效率(通过避免不良聚类和减少总点数)与分布和修剪点所花费的时间方面表现良好。
3.1.3 构建光照分布
接下来,我们在通过第一遍的每个存活点处构建光照分布。每个缓存点处的光照分布实际上由两个独立的分布组成:一个近处光照分布和一个远处光照分布。我们使用多个度量来确定给定的光源 相对于缓存点 是近还是远。首先,我们总是将无限光源(穹顶光源、远距离/立体角光源)视为远处。所有相对于缓存点位置具有大立体角的有限光源被视为靠近缓存点;我们使用以下快速启发式方法来确定这一点:
其中 是光源的质心, 是缓存点 的位置, 是缓存点 的半径, 是缓存点分离距离的调整项——我们根据经验确定应将其设置为 4.0 以获得最佳结果。
我们将近处光源与更远的光源分开,因为来自近处光源的辐照度可能相对于位置和表面法线方向高度变化。近处光照分布将其所有成员放入单个区间(bin)中,而远处光照分布实际上由七个区间组成,对应于缓存点位置处的七个虚拟传感器:六个面向基本方向的定向平面,和一个位于点中心的全向接收器。我们遍历场景中的所有光源,估计每个光源在忽略遮挡的情况下对每个传感器做出的总贡献,并在每个区间中存储一个包含 4 到 256 个光源的列表,这些光源占到达该点能量的 97%(Shirley et al. 1996)。
我们不为近处光照分布预计算任何内容;相反,在渲染时,我们为每个路径顶点基于近处光源对该路径顶点精确位置的辐照度贡献,即时构建光源选择 PDF。我们将在第 3.3 节中更详细地描述这一点。对于远处光照分布中六个基本方向区间里的每个光源,我们直接存储在缓存点位置预计算的辐照度估计。对于远处光照分布中全向区间里的每个光源,我们直接存储在缓存点位置预计算的直接fluence(fluence,注:单位立体角上接收的辐射能)估计。全向区间有一个特殊用途:对于具有明确定义法线的表面,估计辐照度是有意义的,因为辐照度是在定向 2D 表面上积分的;但对于法线难以或无法明确定义的情况,我们转而依赖直接 fluence 估计,因为直接 fluence 是在 3D 球面上积分的。由于基于曲线的毛发往往具有极其复杂且快速变化的表面方向,而体积参与介质没有定义的表面法线,我们使用直接 fluence 来驱动曲线和体积的灯光采样。
在这个阶段,我们只估计每个光源的这些值,而将 CDF 和 PDF 的构建推迟到渲染时缓存点查找时进行。这有两个原因:第一,如前所述,对于近处光源,我们可以在渲染时即时构建更高质量的采样分布;第二,Hyperion 支持精巧的灯光链接(light linking)系统,这意味着在渲染时评估灯光链接关系之前,我们无法确定要从光照分布中排除哪些光源。
3.1.4 合并具有相似光照分布的相邻点
在每个缓存点构建光照分布之后,我们执行第二遍修剪,合并共享相似光照分布的邻近缓存点。与第一遍修剪一样,对于每个缓存点 ,我们收集 1e-5 单位半径内最近的 20 个邻居。然后,我们计算缓存点 的光照分布与其最近邻光照分布之间的平均相似度度量 。相似度度量的计算方法如下:对于两个给定的光源集合 和 ,我们求 与 的交集(即两个集合共有的光源集合),然后按如下方式计算相似度度量 :
我们将集合 与集合 交集的大小记为加权的,因为需要考虑到某个光源可能同时存在于集合 和 中、但在每个集合中被赋予不同概率的可能性。因此,我们不只是简单地统计交集中的光源数量,而是为每个光源计算一个相似度百分比 ,定义为:
其中 和 分别表示给定光源在集合 和 中的概率。只要任何给定光源的概率非负, 的这个定义就成立——我们保证了这一点,因为 Hyperion 的光源只允许正的发射值;对于光源支持负发射值的系统(Foundation 2024),则需要修改后的度量。集合 与 交集的加权大小随后定义为交集中每个光源的 之和。这种计算光照分布之间相似度度量的方法有些临时性,但在实践中我们发现它效果很好。 随后被简单地定义为:对 的每个最近邻缓存点求 之和,再除以找到的最近邻数量。
接下来,我们计算缓存点 与其收集的最近邻之间的平均距离,将此平均距离作为缓存点 半径的初始猜测。然后,我们根据缓存点与其最近邻的相似程度调整半径:简单地将半径乘以 。较小的 值表示 中的光分布与其最近邻相对不相似,意味着该空间区域的直接照明辐射场以更高频率变化,因此缩小 的影响范围是合理的,反之亦然。为了防止半径缩小影响缓存点的有效性,我们将其限制为世界空间原始大小的 25%,并保证最小投影屏幕空间大小(相当于 3 个像素)。
最后,我们遍历之前在 的调整半径内找到的最近邻;对于这个最近邻子集,我们保留索引最低的点,并原子地标记子集中所有其他点以供删除。由于半径是根据缓存点光分布之间的相似性进行调整的,我们认为位于调整半径内的点具有足够相似的光分布,因此可以直接合并。
第二遍修剪中的所有上述操作都在所有缓存点上的并行循环中执行;然后执行一个串行循环以删除所有标记为删除的缓存点。在获得最终的缓存点集合后,我们最后一次重建 KD 树,以便在渲染期间使用。
3.1.5 跨缓存点模糊光分布
在每个缓存点构建光列表并合并具有相似光分布的点之后,缓存点数据结构构建过程的最后一步,是模糊(聚合)缓存点之间的远光分布。这一模糊步骤使每个缓存点的远光分布受到相邻缓存点远光分布的影响,从而使所有缓存点的光分布在空间上更加保守;这一步允许我们在路径追踪期间安全地每个路径顶点仅查找一个缓存点。我们不模糊近光分布,因为相邻缓存点之间近光分布的变化频率通常比远光分布更高。
对于给定的缓存点 ,模糊步骤首先通过 kNN 搜索找到距离 最近的 16 个相邻缓存点。请注意,在前面的步骤中我们使用 20 个邻居进行 kNN 搜索,但在这一步我们选择 16;选择 16 的理由如下:在三维空间中,能够围绕另一个相同大小的球体密集排列的等大球体的最大数量是 12(Dai et al. 2019; Hales et al. 2017),无论是面心立方还是六方密堆积构型(Conway and Sloane 1999)。然而,由于我们的缓存点半径可变,我们在最大完美堆积数 12 的基础上额外加 4 个点,作为经验确定的调整因子。
收集到 16 个最近邻后,我们接下来找到到最远收集相邻点的距离 ;我们使用 来确定每个收集的缓存点对缓存点 的相对贡献。对于缓存点 ,我们赋予相对权重 1;对最近的收集相邻点也赋予相对权重 1,而最远的收集相邻点赋予相对权重 1/16。对于介于最近和最远点之间的点 ,相对权重分配如下:
然后我们将相对权重归一化,使其总和为 1。最远点被赋予相对权重 1/16 的原因,是为了确保归一化后,缓存点 的 16 个收集邻居至少占 最终模糊光分布的一半。对于 16 个收集邻居中的每一个,我们从该邻居的光分布中取出所有光源,将它们乘以邻居的归一化相对权重,并将这些光源添加到 的光分布中。在相邻点之间模糊光分布之后,我们保持光分布未归一化,且尚未计算 CDF;我们将此步骤推迟到实际进行光源采样时,因为我们在每个基本方向区间之间对光分布进行插值。
请注意,在此步骤中,为了允许并行处理并避免对相同点进行重复模糊,我们不能在内存中原地执行模糊;相反,我们需要将输出的模糊缓存点写入一组新的缓存点,然后交换内存。
3.2 可见性估计的在线学习
3.2.1 通过跟踪样本比率进行可见性估计
缓存点最初构建时未考虑遮挡信息;在渲染过程中,我们通过在每个缓存点学习每个光源的可见性估计来改进采样。我们的方法在概念上与重要性缓存(importance caching)有些相似(Georgiev et al. 2012)。每次我们从缓存点选择一个光源时,我们就在该缓存点内为该光源递增一个内部样本尝试计数器。然后我们执行直接光照;如果样本成功到达光源并接收到有用的光贡献,我们就在同一缓存点内为同一光源原子地递增一个内部成功样本计数器。Hyperion 使用分批波前(batched wave-front)路径追踪架构,渲染过程被划分为若干离散迭代(Eisenacher et al. 2013);在迭代之间,我们使用朝向给定光源的成功样本数 与总样本尝试数 的比率 ,来调整该光源的采样权重:成功采样尝试比率较低的光源被降权,比率较高的则被加权。这个过程有效地纠正了以下情况:一个亮光源最初被识别为对特定空间区域很重要,但最终由于遮挡而变得不重要。我们为缓存点 中的每个光源 分配可见性权重 的具体机制如下,基于成功采样尝试比率 :
是最小比率阈值;当比率降至 以下时,我们认为光源 在缓存点 处实际上被完全遮挡,因此是降权的候选对象。根据制作经验,我们通过实验确定 0.04 是 的一个良好默认值。重要的是,由于缓存点分布相对稀疏,无法捕捉高频阴影细节,为了保持无偏结果,我们必须确保可见性度量永远不会将光源的选择概率完全降为零(Ward 1991)。为了保证降权遵循相对激进的曲线但永远不会恰好达到零,我们选择二次衰减(公式 6)。
每个光源一个标量可见性权重加上二次衰减相对简单,但即便如此,我们发现在复杂遮挡情况下,我们的可见性度量结合相对较高的缓存点密度,相比完全不使用可见性度量可以明显改善噪声。例如,在一个由阳光透过小窗户照亮的房间里,我们的可见性估计通过降低房间大部分区域中原本很高的明亮太阳选择概率,同时在小片阳光池区域保持高选择概率,从而显著降低噪声。
3.2.2 跨缓存点模糊可见性估计
在为每个缓存点的每个光源计算出单独的可见性之后,我们以类似于第 3.1.5 节描述的光分布模糊过程的方式,在缓存点之间模糊可见性权重。基于与 3.1.5 相同的理由,我们选择距离当前点 最近的 16 个点,并使用公式 4 为收集的邻居分配相对权重。我们将所有邻居的相对权重加上 的 1.0 求和,然后取倒数得到归一化项,并用它来归一化所有相对权重。
对于 的光分布中的每个光源 ,我们将 的可见性权重 乘以 的归一化相对权重;然后遍历所有邻居,如果某个相邻点的光分布也包含该光源,就取该光源在该邻居中的可见性权重 ,乘以该邻居的归一化相对权重,并加到 对 的可见性权重上。
模糊可见性权重可以防止以下情况造成的噪声锐利不连续:某个光源的可见性项在相邻缓存点之间发生剧烈变化时,缓存点边界处会出现噪声突变。
在线学习可见性估计系统的效果是:具有复杂遮挡的渲染最初收敛较慢,但随着学习系统在渲染器初始迭代中质量的提高,收敛速度会改善,因为渲染器能够做出越来越好的光源选择决策。由于可见性估计只是馈入缓存点更新机制的另一个度量,利用可见性估计几乎不会给系统增加额外开销(图 5)。
3.3 从缓存点选择光源
在每个路径顶点,我们执行光源选择:首先通过 kNN 搜索选择距离路径顶点最近的缓存点;由于构建过程中的光分布模糊步骤使每个缓存点已经包含其相邻缓存点的信息,我们可以每个路径顶点只选择一个缓存点。对于体积散射,为了避免过多或冗余的缓存点查找,我们还存储先前使用的缓存点,并在当前路径顶点仍在该缓存点半径内时重用它。
对于常规表面上的路径顶点,我们遍历缓存点近处光分布中的光源,评估其对路径顶点精确位置的辐照度贡献;对于远处基本方向区间中的光源,我们使用在缓存点位置存储的预计算辐照度估计来近似辐照度。这些基本方向区间被组合起来,按每个区间的基本方向与路径顶点着色法线之间的相似度加权。基本方向区间的权重被归一化为总和为一,这确保组合加权后的基本方向区间仍产生归一化的光分布。然后,我们为来自近处和远处分布的组合光源列表中的每个光源分配权重:我们直接使用每个光源的辐照度估计作为其未归一化采样权重。然后,我们移除通过灯光链接对当前路径顶点禁用的任何光源,并添加回通过灯光链接标记为当前路径顶点专属的任何光源。最后,我们将每个光源的未归一化采样权重乘以缓存点对该光源学习到的可见性权重。
对于属于体积散射的路径顶点,或位于带有毛发着色器(Chiang et al. 2016)的曲线上的路径顶点,我们则改为计算近处光源对路径顶点精确位置的直接 fluence,并使用远处光分布中的全向区间来获取远处光源的预计算直接 fluence 估计。这些直接 fluence 估计随后被用作未归一化采样权重,然后我们应用与常规表面情况相同的灯光链接和可见性权重调整。
然后基于采样权重生成 CDF 和 PDF,所得的概率分布随后用于为下一事件估计选择光源。由于每个缓存点处的光源分布最多只考虑到达该点能量的 97%,我们还会给每个路径顶点一个较小的概率,使其从场景中的所有光源中随机选择一个光源。因为每个缓存点通常只包含相对少量的附近重要光源,所以包含大量光源的场景变得易于高效渲染——局部优化的光源选择分布所需考虑的光源比例可以被限制在一个较小的固定最大数量内。图 6 展示了一个简单的二维示例,其中包含一个小型缓存点分布,以及渲染器利用缓存点来决定在路径顶点处对哪个光源进行重要性采样。
我们缓存点方法的一个有趣副作用是:尽管初始化缓存点系统需要少量额外开销,且每个路径顶点查找缓存点也有开销,但有时使用缓存点的渲染在渲染时间上仍能与采用次优但计算复杂度较低的光源选择策略的渲染相竞争;图 5 所示即为这种情况。这种效果往往出现在具有极其复杂遮挡几何体的场景中;缓存点可以有效地引导渲染器避免无谓地穿过复杂遮挡几何体投射阴影光线,从而提高整体阴影光线遍历性能。带有不透明度遮罩的遮挡几何体往往会使这种性能差异更加显著,因为在增加阴影光线遍历复杂度的基础上,评估不透明度遮罩还会增加额外的着色复杂度。
至此,我们方法在处理无限光源方面的优势变得清晰。在基于层次结构的方法中,无限光源通常是一个需要特殊处理的特殊情况:无限光源本质上没有可定义的表面区域或空间位置,无法具有明确定义的包围盒,因此不易被纳入 BVH 或任何其他类型的空间加速结构中。因此,基于层次结构的方法通常必须定义某种机制,来决定发送给光源层次结构中有限光源的样本与发送给无限光源的样本之间的比例。然而,由于我们的方法是在我们想要进行光源采样的点上构建空间数据结构,而不是在光源本身上构建,因此我们可以像处理远处光分布中的任何其他有限光源类型一样处理无限光源,并在最终的每路径顶点光源选择 PDF 中正确地对无限光源进行加权。
4 用于体积散射的 Cache Points
除了使用缓存点来学习最优的局部光源选择分布外,我们还使用缓存点系统来学习用于重要性采样体积内散射的分布。结合我们对 null-collision 理论所做的扩展(以高效收集来自非均匀体积的发射),我们的体积内散射缓存点策略使我们能够高效渲染以前难以处理的情况,例如嵌入在光学薄介质中的低消光高发射体积(例如火焰),或具有高度方向性直接光照的薄各向异性介质(例如上帝光和光束)。
4.1 Null-collision 回顾
为了最好地描述我们如何使用缓存点进行体积内散射的重要性采样,我们必须首先简要回顾内散射在体积渲染中的作用。我们首先回顾体积渲染方程的 null-collision 积分形式,该方程计算在位置 沿方向 距离 内的辐射亮度:
其中 。Null-collision 技术向非均匀体积中添加虚拟的 null 粒子,产生一个虚拟的均匀体积;通过该体积,沿光线的自由飞行距离可以通过一个与组合透射率 成正比的 PDF 进行解析采样,该组合透射率由恒定的组合消光系数 形成。 又是三种可能事件类型的体积系数之和:吸收 、散射 和 null-collision 。然后可以使用 Monte Carlo 估计器,以概率 (散射事件)、(吸收事件)和 (null-collision 事件)选择性地评估这些事件。
4.2 体积内散射采样
我们使用缓存点系统来学习方程 7 中的一个重要项:散射系数 与内散射辐射亮度 的乘积——两者结合给出了体积内散射的结果。在缓存点初始化过程中,当我们为每个缓存点遍历每个光源时,除了估计每个光源在每个缓存点处的总贡献外,我们还计算一个散射样本权重 ,它近似于 、入射辐射亮度 和相位函数 乘积在立体角上的积分,其中 是在缓存点影响半径内随机采样的位置, 和 分别是 到光源上随机采样位置和到相机原点的方向(图 8a)。该权重 按每个光源每个缓存点存储(图 8b)。
在体积路径追踪期间,我们查询沿光线最近的缓存点,并使用每个缓存点中存储的权重 构建分段线性的一维 CDF,从中抽取散射样本(图 8b)。由于在某些情况下构建此一维 CDF 可能代表每条光线的巨大开销,我们目前仅对沿相机光线的直接光照样本使用此采样策略。将此技术的使用限制在相机光线上,仍能让我们显著改善视觉上突出的单次散射效果,同时保持较低的整体性能开销。
为了高效渲染诸如光学厚体积中的高阶散射等情况,我们将我们的技术与传统的基于透射率的采样相结合,并使用多重重要性采样(MIS)(Miller et al. 2019)。我们首先使用一维 CDF 选择一个散射点 ,然后在朝散射点移动时使用 ratio tracking 更新路径的 PDF。这个过程重复进行,直到距离采样使光线步进穿过选定的散射点;我们可以将这个过程表示为:
其中每个 是一步的结果。要用 null-collision tracking 来表述同一路径的 PDF,我们使用采样距离和 来计算 ,并且根据我们对追踪算法的选择,我们已经知道 和 。对于在选定散射点之前找到的所有路径顶点,我们应用 PDF 并重复距离采样过程、更新相应的 PDF,直到到达选定的散射点并应用 PDF ;这个过程给出:
虽然公式 8 和 9 表示的路径 PDF 看起来很长,但大多数项会相互抵消,形成一个简单得多的 MIS 权重最终表达式:
我们在图 9 中以等样本数比较、在图 10 中以等时间生产比较,展示了我们的技术与传统 null-scattering 通过 MIS 协同工作的效果。
与等角采样(equi-angular sampling)(Kulla and Fajardo 2012)相比,我们基于缓存点的方法在渲染高度各向异性体积时表现更好,因为我们的方法有效地纳入了相位函数项。此外,我们的方法绕过了在执行距离采样之前先采样光源顶点的需要——相反,我们依赖缓存点系统的散射样本权重 作为直接光照的全局估计。
4.3 体积发射采样
在高度发射的非均匀体积嵌入薄各向异性介质的情况下,我们用于采样体积内散射的缓存点方法,需要与一种高效收集体积发射的方法相结合。需要额外的发射收集方法的原因,可以从 通常的选择方式看出:它通常被选为 的优控函数(majorant),并且介质事件以概率 、 和 发生。在体积发射函数与消光函数强烈不相关的情况下——例如低消光的高度发射体积——null-tracking 很可能会完全跳过潜在的高发射区域。
我们利用了 Kutz 等人(2017)的观察结果:、、 和 可以被视为任意的、不相关的参数,只要它们的贡献被适当的样本权重所抵消。为了迫使 ratio tracking(Novák et al. 2014)在高发射区域采取更多步数,我们不是将 设置为 的局部最大值,而是选择 为 。我们始终将 设置为小于平均体素大小,以避免在单个体素内进行过多查找。由于吸收和 null-collision 事件不需要追踪新光线,我们设置 ,这使得追踪器在每个自由路径样本处收集发射,从而产生每条光线更高质量的发射估计(算法 1)。
算法 1
1: function EVALUATEEMISSION(x, ω, d)
2: w ← 1, Le ← 0
3: repeat
4: Δt ← -ln(1-ζ)/μ̄
5: x ← x - Δt × ω
6: Le ← Le + w × μa(x) × Le(x)/μ̄
7: w ← w × μn(x)/μ̄
8: until (t ← t + Δt) > d
9: return Le
10: end function
接下来,为了使我们的技术可用于下一事件估计,我们不仅需要更好地评估非均匀体积的发射,还需要能够采样并评估采样方向的 PDF。为此,我们首先扩展 Villemin & Hery(2013):我们使用一个发射能量分布网格——它只是体积的较粗版本——以确保体积中发射更强的区域有更高几率接收到光样本。在 Villemin & Hery(2013)中使用的是点采样,但当发射被浓烟遮挡或发射区域很大时,点采样可能是次优的;在这些情况下,需要高样本数才能在光泽反射中捕捉发射细节。相反,我们使用发射优化追踪器来评估沿光线的每个追踪点,在每个光样本中收集更多信息,等效于执行线积分。最后,为了使用 MIS 在立体角域中将 BSDF 样本与我们的自发光体积光样本组合(Simon et al. 2017),我们跟踪光样本光线穿过的发射能量分布网格中的单元,并使用 Jacobian 变换积分存储在每个单元中的 PDF:
我们在算法 2 中总结了这种方法。
算法 2
1: function PDFEMISSION(x, ω)
2: p = 0
3: for 沿光线 (x, ω) 的每个体素 v do
4: t0, t1 ← v 的进入/离开位置
5: p ← p + (t1³ - t0³)/3 × pdf(v)
6: end for
7: return p
8: end function
我们使用 MIS 将基于缓存点的体积内散射采样方法与体积发射采样方法相结合,产生一个统一的体积积分器,使我们能够高效地采样嵌入在低消光或高消光系数非均匀体积中的强光源(图 11)。
5 制作经验与讨论
我们在每一部使用迪士尼 Hyperion Renderer 渲染的影片中,都将 cache points 系统作为默认的光源选择策略;在过去十年中,我们已经用它渲染了数百万最终帧,以及数量级更多的制作中间帧,并取得了巨大成功。由于 cache points 系统默认启用,且其所有构建过程在渲染器启动时自动执行,无需额外的用户干预、用户输入或用户指导,我们的艺术家无需关心他们在场景中放置了多少光源。cache points 系统使我们能够满足艺术指导的要求——在我们最近的许多影片中实现极其复杂的照明——而无需 TD 或渲染团队的任何额外干预;参见图 7。例如,来自《Us Again》的码头序列(图 1)包含大约 480 万个光源;得益于 cache points 系统,该序列的照明和渲染过程如此常规且波澜不惊,以至于我们直到序列完成后才意识到场景中有多少光源。
以上所有之所以可能,是因为为使 cache points 达到生产就绪状态所付出的大量努力。构建一个生产就绪的系统需要考虑系统如何融入艺术家的日常工作流程,并在实际生产案例中展现出明显优势;我们在第 5.1 节中讨论了其中一些话题。使生产就绪系统成为生产就绪的另一部分,仅仅是通过实际使用获得的经验。在实际使用中,挑战性案例和失败案例往往与成功案例一样有趣(如果不是更有趣的话!);在第 5.2 节中,我们提供了几个在生产中遇到的有趣挑战和失败案例的案例研究。
5.1 性能结果与确定性
在制作环境中部署新颖的渲染技术时,渲染时间和内存方面的额外开销与收敛性和艺术家工作流程方面的整体收益之间的权衡,是决定该技术是否值得在生产中部署的关键部分。此外,确定性和时间一致性也始终是制作中的主要关注点。在本节中,我们将讨论这两个主题,并展示来自真实世界制作示例的渲染时间和内存测量结果。
5.1.1 制作场景的结果
我们选择了三个有趣的真实世界生产场景来展示性能结果。第一个场景(图 1)来自我们的短片《Us Again》,之所以选择它,是因为它展示了复杂遮挡与大量光源的组合——总计 4,881,396 个发射性三角形、发射性体积和解析光源。第二和第三个场景来自我们的长片《魔法满屋》。第二个场景(图 4,包含 38,720 个光源)是局部最优光源选择表现相对较好的情况;我们选择这个场景是为了证明,即使在局部最优光源选择的最佳真实世界场景中,我们的 cache points 系统在整体性能上仍然更优。第三个场景(图 5,包含 4,406 个光源)展示了我们学习到的可见性估计在使 cache points 在复杂遮挡下仍保持稳健方面变得重要的情况。所有三个场景都包含一定量的体积散射。我们在配备双 18 核 Intel Xeon Gold 6254 处理器的系统上进行了测量;时间以实际经过的墙上时钟时间表示,所有测量均在 32 samples-per-pixel(SPP)的渲染上进行。
我们展示了总渲染时间(表 1)、均方根误差(RMSE)(表 2)和内存使用量(表 4)的测量结果。为了用一个有用的数字来量化所有采样方法的性能,我们使用 time-to-unit-variance(TTUV)来呈现结果,其定义为方差乘以总渲染时间(表 3)。该指标表示达到方差值为 1 所需的分钟数,使我们能够直接比较每种技术的收敛速度。对于我们在此展示的所有指标,值越低表示性能越好。
在我们所有三个真实世界制作示例中,cache points 在 TTUV 方面相对于均匀光源选择和局部最优光源选择都表现出绝对优势,这意味着 cache points 将始终比任何其他技术更快地达到给定的期望噪声水平。即使在图 4 的场景中局部最优光源选择表现良好,cache points 在 TTUV 上仍快了近 1.2 倍;而在图 1 的场景中,cache points 在绝对墙上时钟时间和 TTUV 上都快了一个数量级。与均匀光源选择相比,cache points 在 TTUV 上大约快两倍到一个数量级不等,这源于 cache points 系统能够保持 RMSE 值接近局部最优光源选择,同时将渲染时间保持在接近均匀光源选择的水平。
使用在线学习进行可见性估计通常会在 TTUV 上带来适度但仍然有用的改进;然而,当存在复杂遮挡时(图 5),我们看到可见性估计在 TTUV 上提供了更显著的 1.2 倍加速。此外,这里展示的测试是相对较低 SPP 的渲染,在此期间可见性估计系统只能学习到可见性项的粗略近似;在实践中,随着可见性估计的改进,TTUV 也会进一步改善。
构建 cache points 数据结构确实会给渲染器的首像素时间(time-to-first-pixel)增加一些开销,并且存储 cache points 数据结构需要额外的内存开销;如表 1 所示,首像素时间增加了大约一分钟;如表 4 所示,额外的内存开销通常在几 GB 的量级。相对于制作帧的典型渲染时间,额外的一分钟启动时间通常并不显著令人担忧。由于我们对渲染器将生成的 cache points 数量设置了硬性上限,我们可以为增加的内存开销提供一个有保证的、固定的上限。我们普遍发现,与典型制作场景的总内存使用量相比,这些增加的内存开销相对较小;而且,除了最简单的场景(如 Cornell Box)之外,cache points 在收敛速度上提供了足够大的优势,使得增加的内存开销是值得的。
表 1:使用均匀光源选择、局部最优光源选择和缓存点进行 32 SPP 渲染的时间。我们分别展示了仅缓存点初始化过程(构建)的时间,以及包含初始化过程的整个渲染时间(总计):
| 时间(32 SPP) | Us Again:4,881,396 光源 | Encanto:38,720 光源 | Encanto:4,406 光源 |
|---|---|---|---|
| 均匀选择 | 10 分 16 秒 | 12 分 2 秒 | 19 分 10 秒 |
| 最优选择 | 123 分 51 秒 | 16 分 32 秒 | 24 分 21 秒 |
| 缓存点(总计) | 13 分 13.1 秒 | 15 分 0.5 秒 | 19 分 35 秒 |
| 缓存点(构建) | 1 分 32 秒 | 1 分 4 秒 | 34 秒 |
| 相对于均匀选择 | 慢 0.29 倍 | 慢 0.37 倍 | 慢 0.02 倍 |
| 相对于最优选择 | 快 9.37 倍 | 快 1.10 倍 | 快 1.24 倍 |
表 2:在 32 SPP 下,使用均匀光源选择、局部最优光源选择和缓存点测得的均方根误差(RMSE)。对于缓存点,我们分别展示了未启用和启用可见性估计在线学习时的 RMSE:
| RMSE(32 SPP) | Us Again:4,881,396 光源 | Encanto:38,720 光源 | Encanto:4,406 光源 |
|---|---|---|---|
| 均匀选择 | 0.2280 | 0.0896 | 0.0675 |
| 最优选择 | 0.1436 | 0.0321 | 0.0377 |
| 缓存点(无可见性) | 0.1448 | 0.0339 | 0.0407 |
| 缓存点 | 0.1443 | 0.0320 | 0.0369 |
表 3:在 32 SPP 下使用均匀光源选择、局部最优光源选择和缓存点测量的达到单位方差所需时间(TTUV)。对于缓存点,我们展示了未启用和启用可见性估计在线学习时的 TTUV:
| TTUV(32 SPP) | Us Again:4,881,396 光源 | Encanto:38,720 光源 | Encanto:4,406 光源 |
|---|---|---|---|
| 均匀选择 | 0.5337 | 0.0966 | 0.0873 |
| 最优选择 | 2.5552 | 0.0184 | 0.0346 |
| 缓存点(无可见性) | 0.2769 | 0.0172 | 0.0324 |
| 缓存点 | 0.2753 | 0.0154 | 0.0267 |
表 4:均匀光源选择和缓存点的内存使用情况,两者之间的差值即为缓存点所需所有数据结构的总大小。我们没有单独列出局部最优光源选择的内存使用情况,因为这些值与均匀光源选择相同:
| 内存使用 | Us Again:4,881,396 光源 | Encanto:38,720 光源 | Encanto:4,406 光源 |
|---|---|---|---|
| 均匀选择 | 33.62 GB | 45.0 GB | 85.6 GB |
| 缓存点 | 37.51 GB | 46.17 GB | 87.05 GB |
| 增加百分比 | 11.57% | 2.6% | 1.69% |
5.1.2 确定性与时间一致性
在给定相同起始随机种子和相同输入场景的情况下,我们的缓存点系统是完全确定性的。由于缓存点初始化过程高度并行化,必须格外小心以确保并行化步骤后仍保持确定性。在合并空间上相似的候选位置、合并具有相似光照分布的相邻缓存点以及在缓存点之间模糊光照分布的步骤中尤其如此;我们已在前面章节中详细说明了如何利用步骤间的排序和原子操作来避免竞态条件并保持确定性。
目前,我们没有采取任何额外步骤来保持帧间的时间一致性分布;我们为每一帧构建新的缓存点分布。这样做有两个原因。首先,由于系统相对于随机种子已经是确定性的,输入场景的微小变化通常只会导致缓存点分布发生与场景变化直接对应的微小变化。通常,当使用相同的起始种子进行渲染时,这一特性足以保持相邻帧之间的一致性;并且由于缓存点产生的是无偏的直接光照采样,随着图像收敛,任何噪声差异都变得无关紧要。其次,在实际制作中,我们希望相邻帧具有独立的采样,因此我们为每个镜头中的各帧赋予唯一的种子值。这样做的原因是,我们的制作光照工作流程广泛依赖于我们内部降噪器(Dahlberg et al. 2019; Vogels et al. 2018)先进的跨帧降噪能力,它受益于跨多帧重用和分散每帧的唯一样本(Zimmer et al. 2015)。
在生产使用中,时间一致性对我们的 cache points 系统来说并不是一个显著的问题,我们也不需要采取进一步措施来避免相关问题。一个罕见的例外情况在第 5.2.1 节中描述。
5.2 案例研究
在众多制作过程中,我们偶尔会遇到一些有趣的边缘情况,给 cache points 系统带来了挑战。我们在此详述一些例子。
5.2.1 失败案例:窄聚光灯
在《奇异世界》(Strange World)中,我们在使用 cache points 的生产场景中遇到了一些问题:这些场景在非常大的大气体积中使用了非常窄的聚光灯(图 12)。使用 cache points 渲染产生的帧中,聚光灯光束出现缺口或断裂,并且这些伪影在多个帧之间也是时间上不稳定的。因此,在这类场景中,艺术家有时不得不手动禁用 cache points 系统——这在我们制作中是罕见的情况。
经过进一步调查,我们发现这个问题仅仅是因为我们在聚光灯的那些特定区域缺少 cache points。对于伪影区域内的点,最近的 cache points 位于聚光灯光束之外,因此其光分布中不包含该聚光灯;于是从光分布中采样该聚光灯的概率为零,聚光灯只能通过我们为缓存点光分布之外的光源保留的低概率被极少地采样到。由于 cache points 最初是随机分布在物体包围盒中的,将缓存点恰好放置在聚光灯锥体内的机会相当低,因为聚光灯角度相对于周围体积的大小来说非常小。我们在播种缓存点时不考虑光源位置或方向,因此无法保证将缓存点放置在聚光灯锥体内。这就解释了为什么伪影在帧之间是时间上不稳定的:有时我们运气好,缓存点放置得当;有时则运气不佳。
这个问题的一个潜在解决方案,是在渲染的后续迭代中添加新的缓存点。我们可以使用后续迭代中的光线命中作为新的缓存点候选,并使用第 3.1.2 节所述方法的修改版本来接受它们。然后,我们希望更新现有缓存点的分布,以考虑新添加的缓存点。
5.2.2 失败案例:扩展到数十亿光源
如第 2 节所述,虽然我们没有使用光源层次结构进行全局多光源采样,但我们确实使用光源层次结构来选择自发光网格内的各个三角形。然后,cache points 系统将每个自发光网格视为单个光源,而不是在缓存点系统的光分布中直接处理每个自发光三角形。做出这一选择的一个主要动机来自《海洋奇缘》(Moana)期间的一项早期实验:该实验将每个自发光三角形直接作为可唯一寻址的光源放入缓存点系统。虽然该实验在渲染时的光源采样方面没有问题,产生了预期的质量,对光源采样的计算工作量也没有重大影响,但它确实导致渲染器启动时缓存点构建时间极长。原因是:我们目前在将光源分类到近处和远处分布时,以及在确定将哪些光源放入远处分布的哪些基本方向区间时,只是简单地线性遍历场景中的所有光源。由于我们以线性循环方式执行这些步骤,当场景中的光源数量接近巨大数字(例如数十亿)时,cache points 系统的启动时间扩展性很差。另一种方法是使用空间加速结构来筛选构建光分布时需要考虑的光源数量;一种可能性是简单地将每个光源的质心放入 KD 树并执行 kNN 搜索,另一种可能性是使用光源层次结构——不是用于多光源采样本身,而是用于驱动缓存点光分布的构建。
5.2.3 体积散射中的挑战
使用 cache points 改进体积内散射采样和体积发射采样,显著提高了我们高效渲染复杂和困难体积设置的能力(图 13)。随着我们电影视觉复杂性和丰富性的不断提高,我们的艺术家现在通常会为大多数场景填充某种形式的薄大气体积,以提供额外的光照细节和造型。嵌入薄体积中的火炬或发光魔法效果以及戏剧性的上帝光,对我们来说都是常见的场景;有关我们利用 cache points 进行更好体积采样的一些近期制作示例,请参见图 13。
然而,我们当前用于体积内散射和体积发射采样的 cache points 解决方案的一个主要缺点是:该系统会显著增加渲染时间;每个 SPP 的方差低得多,但计算所需的时间也长得多。因此,虽然多光源采样的 cache points 默认启用,但我们还无法将体积内散射和体积发射采样的 cache points 也默认启用。虽然除了在渲染体积时简单地决定是否启用该系统外,艺术家无需设置或调整任何额外参数,但我们仍然希望艺术家甚至不需要做出打开或关闭系统的决定。理想情况下,我们要么找到一种方法来降低该系统的每 SPP 计算工作量,要么推导出一种机制,使渲染器本身能够在渲染时自动检测该系统在当前场景中是否有帮助,从而自动启用或禁用该系统。
我们体积解决方案的另一个小缺点是:该系统依赖于已经为多光源采样存在的缓存点位置,并且在选择缓存点位置时没有更多地考虑额外的体积参数。虽然缓存点被放置在路径发生体积散射的位置,但我们没有采取任何措施来增加光学薄介质中的缓存点密度——在这类介质中,较大的自由飞行距离意味着缓存点可能分布非常稀疏;并且在选择缓存点位置时,我们完全没有考虑体积发射场。对于体积内散射和发射采样,缓存点覆盖密度不足可能导致类似于第 5.2.1 节讨论的噪声不连续性,而缓存点覆盖过于密集则可能导致不必要的内存使用增加。对于上帝光这样的情况,一个可能有用的扩展是添加第三种基于从光源进行光子追踪的缓存点位置播种机制。对于体积发射等情况,一个可能有用的扩展是在体积的包围盒内放置缓存点位置时,考虑各个体素的范围和密度。
6 未来工作
我们现已在许多制作中成功使用了 cache points 系统;迄今为止,所有使用迪士尼 Hyperion Renderer 渲染的制作都默认启用了 cache points 系统。然而,本着不断寻求改进艺术家工作流程的精神,我们设想对 cache points 系统进行一些可能的改进。
交互性与 GPU 实现。 随着交互性、快速的艺术迭代时间以及最佳的首像素时间在所有依赖渲染器的用户工作流程中变得越来越重要,需要在渲染器开始追踪光线之前进行预计算的算法变得越来越没有吸引力;因此,我们对能够在交互式用例中良好工作的渐进式 cache points 公式感兴趣。与其预先构建整个缓存点数据结构,我们设想在渲染的最初几个 SPP 期间并行地渐进构建缓存点数据结构,这可能是一种有希望的方法,可以加快首像素时间,同时仅在初始样本集中牺牲少量的噪声改进。此外,虽然我们的内部 CPU 生产渲染器在其存在的几乎整个历史中都使用了 cache points 系统,但我们的内部交互式 GPU 路径追踪器目前使用 ReSTIR(Bitterli et al. 2020)与无遮挡估计的光源层次结构(Estevez and Kulla 2018)的组合进行光源选择;理想情况下,我们希望在两个渲染器上使用相同的光源选择策略。为此,将 cache points 系统重新公式化,使其在 GPU 上无论是构建还是采样都能良好工作,是我们的一个主要兴趣点。我们还希望试验将 cache points 用作驱动 ReSTIR 的初始光源选择方法。
替代空间数据结构。 我们的 cache points 系统目前将点存储在 KD 树中;我们有兴趣研究更好的空间数据结构,以减少内存占用、改善数据结构构建时间或改善点搜索时间。虽然由于需要执行多次 kNN 搜索操作,KD 树可能仍然是初始缓存点构建过程的一部分,但在实际路径追踪时,我们只需要为每个路径顶点查找一个单一的缓存点,这使得诸如哈希网格之类的空间数据结构成为存储最终渲染时缓存点分布的有前途的替代方案。对于 GPU 实现,多分辨率哈希网格比 KD 树尤其有吸引力(Davidovič et al. 2014)。
改进的采样信息。 我们的系统目前在执行光源选择时没有利用联合采样(joint sampling)来考虑 BSDF(Christensen et al. 2018);添加这一能力可能有助于消除对大量与高光泽 BSDF 不匹配的光源进行采样的需要。在真实世界的生产场景中,我们预计联合采样方法与我们的遮挡估计方法相结合可以显著提高采样效率。类似地:我们目前在构建过程中合并空间相邻的缓存点时,没有考虑表面方向;一个潜在的解决方案是为放置在表面上的缓存点纳入表面法线,并允许法线高度发散的、原本相邻的缓存点不被合并。
与路径引导相结合。 目前我们使用两个独立的系统来引导直接光照和间接光照;对于间接光照,我们使用 Practical Path Guiding(Müller 2019; Müller et al. 2017)。统一直接和间接光照的引导系统是一个值得追求的目标;为此,我们已经研究了将 Practical Path Guiding 与 Vevoda 等人(2018)的技术相结合,并取得了有前景的结果。
与光子映射相结合。 Hyperion 包含一个用于渲染折射焦散的光子映射系统。由于该光子映射系统是在缓存点系统核心实现之后才实现的,我们的缓存点系统目前并未利用光子映射系统的任何能力,但这两个系统似乎具有互补的能力。例如,使用前向光追踪中的光子来生成候选缓存点位置,是我们现有方法的自然延伸,并且可能有助于处理像第 5.2.1 节中的情况。我们的光子映射系统使用自适应光子引导技术,在渲染过程中学习光源上的光子发射函数,类似于 Estevez 和 Kulla(2020a; 2020b);将这种自适应光子引导与缓存点中学习到的遮挡估计相结合似乎很有前景。最后,我们的缓存点位置是预先选定的,在渲染过程中不再进一步细化;使用类似于 PPM(Hachisuka et al. 2008)和 SPPM(Hachisuka and Jensen 2009)中的机制来渐进细化缓存点位置,是一种可能的途径。
7 结论
我们提出了 Cache Points,这是迪士尼 Hyperion Renderer 的多光源采样系统,在过去十年中被用于渲染数百万生产帧。我们详细描述了缓存点如何被填充、系统的新颖方面(如可见性估计的在线学习)、它们在渲染时如何用于光源采样,以及我们如何将其扩展用于加速困难的体积散射情况。我们还讨论了该系统的一些生产经验、真实世界的成功案例和失败案例,以及未来改进的潜在路径。
致谢
本文提出的技术多年来持续改进,Hyperion 开发团队的现任和前任成员都做出了许多贡献。除作者外,cache points 系统的其他主要过往贡献者包括 Patrick Kelly、Ralf Habel、Ben Spencer、Benedikt Bitterli 和 Matt Jen-Yuan Chiang。作者还感谢 Hyperion 开发团队的 Mackenzie Thompson、Andrew Bauer、Brian Green、Mark Lee 和 Lea Reichardt 对本文的支持与反馈。
我们感谢 Disney Research|Studios 的 Jan Novák、Marios Papas 和 Thomas Müller,以及 Pixar RenderMan 开发团队的 Cliff Ramshaw 和 Julian Fong,就多光源采样和通过光学薄介质的体积散射等主题进行了有趣而有益的讨论。我们还感谢 Ivo Kondapaneni 在 Hyperion 的实验分支中实现了 Vevoda 等人(2018)的技术,这成为了有用的比较基准。我们也感谢匿名论文审稿人的宝贵反馈。
最后,我们特别感谢众多使用过 Hyperion 的艺术家和技术指导,他们多年来的反馈、建议和合作影响并塑造了渲染器的各个方面,包括本文提出的缓存点系统。