LightGraph:使用最短路径查找在参与介质中实现高效多重散射
- 作者:admin
- /
- 时间:昨天 10:03
- /
- 浏览:41 次
- /
- 分类:厚积薄发
【USparkle专栏】如果你深怀绝技,爱“搞点研究”,乐于分享也博采众长,我们期待你的加入,让智慧的火花碰撞交织,让知识的传递生生不息!
本文提出了一种在离散高分辨率非均匀参与介质中估计多重散射的有效方法,称为“LightGraph”。该方法基于随机生成的图表,通过使用最短路径查找来估计光在体积中的传播方式。这种新方法提供了一种实现高质量照片级多重散射效果的方式,而其计算成本相对较低。该方案的目标不是物理上的准确,也不是实时运行,而是从实用的角度出发成为一种快速可靠且灵活性高的解决方案。
这项工作是Alexandre Sirois-Vigneux在蒙特利尔大学IFT-6042的背景下用一个学期的时间完成的,项目已开源,建立在OpenVDB之上,使用光线追踪为基础渲染方式。
PS:文章出现的部分文献链接可在文末查看。
一、内容介绍
视觉效果制作的当前趋势仍然围绕着Arnold之类的路径追踪器,因为这些系统非常直接和可预测。大型工作室拥有的渲染农场使得这些昂贵的技术在过去几年中得以在实践中使用。该行业倾向于使用更简单的技术,这些技术使用更多的机器时间和更少的人工时间,并认为这是生产方面最有效的权衡。但行业现正在迅速转变为另一种模式,过去需要数月才能完成的任务现在预计数周内就能完成。在这种新趋势下,工作室通常需要在几个小时内处理问题。
为此,我们提出了一种使用最短路径查找(SPF)来估计多重散射影响的解决方案。单次散射事件由传统的RayMarching进行处理,而多次散射事件则通过对对应于图形顶点的点云执行密度估计来近似。我们的思路是使用体积中的几百个顶点随机定义多个图,然后根据用户定义的密度网格对边缘进行射线行进以评估它们的透射率,接着使用这些透射率作为权重以最短路径查找找到每对顶点之间最少遮挡的路径。这个过程可以并行重复多次并光栅化为一个体积网格。
最后,RayMarching估计器可以在渲染时将多次散射的网格视作自发辐射组件直接进行距离采样,这使得RTE评估过程非常有效。尽管这种技术本质上存在Bias,但结果表明由于性能上极具优势,所以该技术仍然可以作为视效工作的有效手段。
二、前置工作
回顾一些和本文有关的工作。
B.Wang和N.Holzschuch在SIGGRAPH 2017提出了一种技术,用于预计算多个散射事件(假设介质无限大),并将其存储在两个4D表中。他们的技术可以与多种渲染算法一起使用,并且能够显著加快收敛速度。不幸的是,它仅适用于参与介质,因此无法用于渲染云、烟或者任何模拟流体等。这一工作发表《Precomputed multiple scattering for light simulation in participating medium》一文中。
Szirmay-Kalos等人在2005年提出了一种实时方法,用于计算具有一般相位函数的非均质参与介质中的多重散射。他们将参与介质建模为一个粒子系统,假设体积是静态的,而光和相机仍然可以运动。该方法将介质粒子间的光线散射存储在“照明网络”中,这一工作发表在《Real-time multiple scattering in participating media with illumination networks》一文中。
我们之前在《参与介质中的实时多重散射和照明网络》中也有专门分析过。
虽然这一思路允许实时计算照明,但结果精度较低且不支持动画体积,这两点极大限制了它的使用。
D.Koerner等人在2014年提出了一种称为“flux-limited diffusion”(翻译为“辐射通量限制扩散”)的方法用于渲染参与介质中的多重散射效应。文章为:《Flux-Limited Diffusion for Multiple Scattering in Participating Media》。基于扩散近似是蒙特卡洛路径追踪一种极其有效的替代方法。但是在足够透明区域中,经典扩散近似会受到非物理辐射通量的影响,导致与正确的光传输匹配不佳,这阻止了将经典扩散近似应用于非均质材料领域。为了解决这个问题,Koerner引入了天体物理学中的一种技术——Flux-limited diffusion。新的扩散算法能够更准确地呈现各种非均质材料中的多重散射,但是目前这一技术尚未被证明在HDR照明环境下会表现如何,环境光散射的引入方式是视效类体积渲染器中非常重要的一部分,但往往也是最容易被忽略的一部分,在相当多的工作中都是如此。
Kallweit等人在SIGGRAPH 2017提出了一种使用蒙特卡洛积分和神经网络相结合的方法高效合成大气云景, 也就是大家所熟知的Disney那篇《Deep scattering: rendering atmospheric clouds with radiance-predicting neural networks》,该方案相较于以往手段可以高效地推测云中任何一点的辐射,缺点就是神经网络和着色参数非常复杂且高度专注云渲染,很难直接推广到其他材料比如烟和雾,从而限制了它的应用。
PS: 当然更轻量,泛化性更强的神经网络在SIGGRAPH 2023上被提出来,对此有机会我们再做分析与解读。因为本文所讨论的工作出现在2020年,仅适合对之前的方案做对比。
Jensen等人在1998年提出了一种光子映射扩展方法来计算参与介质场景中的全局照明:《Efficient simulation of light transport in scenes with participating media using photon maps》虽然很老了,但非常经典,影响也很大。这种方法适用于双向路径追踪,使用体积光子图来提高效率并降低噪声。可以轻松重现多重散射等效果,但目前还不清楚这种技术在处理像火焰这种黑体辐射类体积时效果如何,且火焰烟雾是VFX中经常出现的场景。
三、方案概述
本方法试图利用参与介质中多重散射的低频特性,通过使用极少的样本近似解,然后将这些样本光栅化为稀疏的低分辨率网格以确保在渲染时快速查找。因此,多重散射在渲染开始之前会预先计算并存储在内存中。这个多重散射网格(MSG)将以类似于RTE中Le自发光的方式进行采样。该方法的一个特点是,使用SPF(最短路径查找)来估计介质中两点之间传播的光量,而不是依赖随机游走,这会带来Bias,但也显著加快了收敛速度,因为大多数路径对解决方案都是有意义的贡献。
以下是LightGraph的一些主要功能,它支持通过命令行以参数链形式提供场景描述,支持多光源(包括点光、定向光和环境光(类似天光或HDR照明之类的))。如下图所示,每个渲染图像都以EXR格式写入磁盘,其中包括3个任意输出变量(AOV),分别隔离单次散射,多重散射和自发光的贡献。还有一个选项可以通过将LightGraph几何图形(动态创建的以计算多次散射)输出为ASCII文件,用于调试或可视化目的,还可以发送多个相机光线以减少混叠。内置着色器处理温度网格,并具有颜色渐变参数,允许用户将温度值重新映射到体积的发射色。

使用带有日落HDR图的环境光渲染Bunny,与纯定向光照明相比计算成本并没有更高

使用LightGraph渲染爆炸,单次散射,自发辐射,多次散射与单散射+自发光合成图像渲染规格:一个定向光,一个恒定蓝色的环境光,迭代次数:5000
四、实现细节
给出的仓库中使用C++实现, 基于Intel的TBB完成多线程。也尝试使用了OpenMP多线程机制,但结果发现与TBB相比性能要慢很多。总之整套实现基于多个三方库完成,并遵循了VFX行业中一些成熟的标准,数据结构小节将更详细地讨论这些内容。
1. 最短路径查找作为重要性抽样启发式方法
MIS(多重重要性抽样)是蒙特卡洛模拟方案中的关键部分,它具有无偏的理论优势,但即使最先进的方法也难以在合理时间内收敛,尤其是在涉及多重散射时。本文所讨论的方法在理论上没有保证能收敛到正确的,但经验表明它可以收敛到结构至少看起来是“正确的”。
如下图所示,SPF试图避免在不会对多重散射产生重大贡献的路径上浪费时间。

可以看到,我们强制解决方案仅对高辐射传输的路径采样,支持这一决策的重要经验是:假设仅考虑体积中每对顶点之间最有价值的路径就足以产生最大影响的采样分布。因此,我们将精力集中在对可感知信息产生最大影响的采样上。正如稍后将讨论的那样,这种启发式方法的计算成本比MIS路径追踪高得多,但它的随机性也低得多。由于执行多重散射估计得底层图非常粗糙,因此单个LightGraph迭代返回的解决方案可能包含显著的低频方差。但随着我们聚合更多这样的迭代(如下图所示),这种方差会减少,直到它无法被肉眼感知到。

左侧是100个LightGraph迭代相互重叠的几何图形可视化,右侧是100个迭代中的8个独立迭代图形的顶点由其辐射扩散之后的值着色,整个过程在硬件上计算不超过8s
2. 数据结构
既然是CPU渲染器,稀疏体素数据结构选择OpenVDB就很好了。OpenVDB也依赖了Industrial Light & Magic开发的OpenEXR用于以高动态范围半浮点格式存储渲染图像。
3. 算法概述
算法伪代码如下:

4. 多重散射估计
点云创建:我们首先使用“飞镖投掷算法”将点散布在体积内,以使用尽可能少的点来最大限制地提高估计质量。根据经验,每个LightGraph迭代750个点能够在图形分辨率和运行时性能之间取得良好平衡,点仅散布在包含密度的体素中(空体素不撒点),每个点都以至少δ的距离添加到所有其他点以确保密度网格内的均匀分布。用户无需执行任何特殊操作来强制执行750点的约束,因为系统会在投掷飞镖时动态调整δ。首先根据边界框的大小对δ进行估计,以使其保持尺度不变。然后,预定义的多项式函数会估计点在点云中累积的预期速率。每投掷10000个点,就会与该预期值进行比较,然后调整δ。增加δ可以减缓点的累积,因为这会迫使它们彼此之间距离更远。通过减少δ可以获得相反的行为。每次LightGraph迭代中。总共有100万个点被投掷到密度网格边界框中,这意味着每次迭代最多调整99次。有一个提前停止机制,如果累积点超过750. 就会停止投掷飞镖。从测试实验来看,提前停止很少被触发,并且当使用时,迭代总是即将完成,这是预期的行为。如果迭代在投掷几次飞镖后就提前停止,点云分布的质量很可能会受到影响,点云需要保持较小的主要原因是后续步骤中使用的SDF算法的复杂性。每次迭代都会修改自己的δ版本以启用线程安全的读/写访问,因此每次迭代都在单独的线程上并行运行。每次迭代会创建一个单独的随机数生成器实例,以确保算法的确定性结果。
图创建:然后,我们构造一个布尔邻接矩阵来存储散点之间的边缘。在最大半径1.7 X δ内,最多允许与相邻点建立12个连接。
射线行进图边缘:然后将图形的每个边与输入网格的密度网格进行射线行进,以计算每个段的透射率,将这些预计算的透射率值存储在另外一个浮点值矩阵中。标量参数可供用户单独调整密度值以进行多次散射计算。根据Kyle Hegeman等人2005年《A lighting model for general participating media》中的研究,将用于单次散射的密度与用于多次散射的密度分离可以更好地适应密度更大的介质中的蒙特卡洛模拟。
最短路径寻找解决方案:接下来,我们通过运行Floyd-Warshall算法的修改版本找到每对顶点之间透射率最高的那条路径。求解是按通道执行的,因此如果要渲染的体积具有波长相关的散射值理论上它可以为每个RGB分量找到单独的最佳路径。此步骤将通过考虑当前图中每对顶点之间的所有可能路径来确定透射率最高的路径。在SPF求解后,结果透射率存储在对称权重矩阵中,路径本身则永远不会被存储。
顶点照明计算:通过阴影射线沿着密度网格向场景中的每个光源行进,计算图中每个顶点接收到的辐射度并将其存储到数组中。
辐射扩散:在执行辐射扩散之前,我们调整SPF步骤中计算出的对称权重矩阵以强制能量守恒,即:我们确保每个顶点扩散的能量不会超过其在顶点照明阶段接收的能量,这是通过将从一个点到图形中所有其他点的所有透射总和限制为1实现的。这样,图形在扩散前后仍将包含相同的总辐射。然后我们执行辐射扩散,其中图形的每个顶点将根据归一化权重从所有其他点收集辐射。
将点聚合到稀疏网格:一旦计算完所有的LightGraph迭代,点就会聚集在稀疏网格中,以确保快速查找查询。为了实现最佳性能,网格的分辨率会动态调整为每个体素存储大约8个点,如OpenVDB所建议的那样。这一步对于该技术至关重要,因为我们可能会处理大量的点。这种加速结构的质量将对下一步的性能产生重大影响,我们将搜集到的辐射度光栅化为体积网格。
将多散射光栅化体积网格:使用与密度网格相同的稀疏树创建多重散射网格(MSG), 但默认情况下其体素大小为原始体素大小的4倍,从而有效地创建体素数为密度网格的的体积。这种降采样策略将保持较低的内存占用,同时仍提供足够的分辨率来正确捕获本质上是低频的多重散射。此MSG可防止算法在渲染时对网格进行RayMarching时在每个样本处执行点云查询。由于数据结构是稀疏的,我们在缩小的MSG中激活每个活动体素周围的一个体素的填充(最多33-1=26个体素),以防止由于MSG对密度网格的覆盖范围有限而产生伪影,如下图所示:

蓝色为密度网格,橙色为1/4分辨率的MSG网格,绿色为减少伪影而考虑的Padding
这种Padding很重要,因为我们将在渲染时使用密度网格作为MSG的掩码,然后,我们迭代MSG的每个活动体素,并使用各向同性高斯核进行密度估计:

其中是体素位置x处估计的多重散射,k(•)是具有参数μ=x和σ,它定义了所有考虑的相邻点位置xi的权重。参数σ2源自Points per Kernel用户参数k,我们首先需要定义在点云中寻找其他点的最大距离。我们知道数据结构平均每个体素包含8个点,那么将γ设置为体素的宽度,因此有:

其中V是预计包含8个点的体积,然后我们可以将V乘以比率k/8,并求解最大搜索半径r:

对于具体情况,n维高斯核的表达式可以简化为:

其中,因为核是各向同性的。我们使用截断高斯核,并且只考虑权重大于经验确定的阈值0.1的点。现在我们可以使用此信息求解σ2了:

5. 逐像素RayMarching
此时,我们已经将多重散射存储在MSG中,因此可以在恒定时间内在体积内任意一点对其进行三线性插值。因此,可以使用现有的射线追踪技术对体积进行射线行进,将多重散射视为简单的自发光网格一样处理。
为了避免因密度和MSG之间的分辨率不匹配而导致的伪影,我们使用密度网格作为MSG的掩码。对于此掩码,密度网格的值范围被限制在[0,1]范围内,然后默认提升到0.25次方,与蒙特卡洛模拟相比,这可以提供最佳拟合度。
然后使用传统技术对图像进行光线行进以解决参与介质中的单次散射。每条主射线都会对温度网格(如果有对应的VDB输入)以及MSG进行采样。阴影射线也会从主体积样本投射,并朝着场景中的每个贡献光源进行RayMarching。温度值被重新映射到从内置着色器的颜色渐变参数部分派生处的RGB颜色。当所有像素都完成渲染后,每个像素的RGBA值以及3个额外的AOV将作为半浮点EXR图像保存到磁盘。
6. 算法复杂性分析
创建MSG的大多数步骤都涉及O(n2)的算法复杂度,其中n是第一步中生成的点云中的点数。不幸的是,SPF步骤的算法复杂度需要O(n3),一旦点数达到一定数量,它就会崩溃。为了解决这个限制,我们将计算分为λ个单独的LightGraph迭代,然后将它们聚合起来。由于强制n→50,SPF以及迭代中的所有其他步骤在运行时间方面变得非常可预测,可以看作是恒定的计算时间。整个LightGraph在O(λn3)下运行,这是一个比O(λn)3更可行的解决方案。这种分离还使算法可以轻松并行化。通过将多重散射光栅化为MSG,计算时间得到进一步减少,从而有效地将渲染部分的算法从复杂度O(ps(log q+s))降低到O(ps2), 其中p是图像中的像素数,s是每个路径的“相机/阴影样本数”的上限,q是从所有LightGraph迭代中聚合的点数。一旦计算完成,MSG便可在恒定时间内有效地提供此信息。如下表中所看到的那样,考虑单次迭代,MSG创建远非算法中昂贵的部分。在内存占用方面,我们的方法为O((1/64)*v+750λ),其中v是输入密度网格中的体素数。在大多数现代机器上,即使λ值很大,额外的内存使用量也不会引人注目。

7. 预计算的优势
该方法的一个关键优势是,除非体积或光线被动画化,否则近似产生的噪声是不可感知的。多重散射估计可能会有很大偏差,但在视觉上仍然可信,因为与我们通常使用蒙特卡罗积分获得的噪声相比,噪声的频率非常低。如果相机在体积周围移动,则只有单次散射会被重新计算为新解决方案,因为无论使用什么相机,多重散射解决方案始终相同。如果光线发生变化,底层LightGraph迭代在每一帧之间仍将保持不变。只有顶点照明计算和辐射扩散会产生不同的结果。底层结构不受干扰的事实使得解决方案即使迭代次数较少也能对光线变化保持高度稳定。,如下图所示:

3个定向灯,Iterations:25,Points Per Kernel:1, Scatter Scale:3.0,Scatter Density Scale:0.5,Scatter Density Min:0.025, Scatter Density Mask Power:0.25,Volume Color:1.0, Scattering:1.5
最后,如果体积被动画化,一切都会逐帧发生变化,这可能需要更多迭代才能实现整个序列的时间稳定性。
8. 收敛速度
每个核的点数k以及LightGraph迭代次数λ是决定多重散射解决方案稳定性的两个用户参数。在本节中,我们将重点介绍这些参数如何影响到解决方案的稳定性、运行时性能和细节水平,以便对控制估计质量的因素形成直觉性认识。为了评估该方法的收敛速度,需要使用RMSE(均方根误差)指标:

其中xi是根据收敛像素值μ测试的像素值。从下图中,我们可以提取出0.135的收敛阶数,这通常相当糟糕,但在我们的案例中,图中的橙色线表示近似阈值,在该阈值上,误差变得无法被人眼察觉,在大多数情况下,这种情况发生在≈35秒的计算之后。

收敛和非收敛渲染之间的RMSE,相对于LightGraph迭代次数,橙色水平线表示误差变得无法被眼睛察觉的大致点
从下图可以看到,得益于并行实现,我们可以将λ从1增加到10而无需支付任何额外的成本,一旦我们超出了机器上可用的线程数,性能就会开始下降:

相较于λ和k的收敛速度,第一行显示使用固定的每核点数看k=1然后增加LightGraph的迭代次数λ的结果。下面一行显示使用固定的λ=10将多重散射估计光栅化为低分辨率MSG时不断在增加k的结果,每个图像顶部的运行时分别表示计算LightGraph数据结构(左)和光栅化(右)需要的时间。第二行的结果表明,增加k 的成本比增加λ的成本低得多。但我们也看到,这往往会使得估计值变得平滑,在某些情况下,我们可以用λ≈25获得完美的结果。如果我们有一个动画体积序列,并且无法增加k来保留细节,我们可能需要转到500才能在整个序列中达到时间稳定性。注意,k总是乘以λ以使内合大小和λ无关。这意味着在实践过程中k=5和λ=10的组合定义了一个使用每体素估计50个点的内核。
五、方案结果
为了解我们的技术与最先进的解决方案相比如何,我们选择使用LightGraph(我们的方法)和皮克斯生产渲染器的最新可用版本:RenderMan 23.2 15 来渲染多个场景。我们尝试在相似的时间范围内渲染这两幅图像,以查看在紧张的渲染时间预算下这两种软件可以生成什么样的结果。我们还提供了一个更加融合的RenderMan图像版本作为参考。对于RenderMan,我们使用它们的路径跟踪积分器,如无特别说明,其多次散射反弹限制为10次。用于测试的硬件是英特尔Hexa-Core i7-3930K CPU@3.8GHz,配备64GB RAM。每幅图像以960x540的分辨率渲染,就像素数而言,相当于全高清帧的四分之一。实验中每幅图像的渲染规范将分别在每个小节中给出。
请注意,与路径追踪的渲染时间与图像中的像素数量成线性比例不同,我们的方法将多重散射计算与图像大小分离开来。这意味着只有算法中相对便宜的单次散射部分将线性依赖于像素数量。因此,多重散射的计算与像素数无关,这对于覆盖大部分帧的高分辨率图像尤其有效。
1. 云用例
云用例使用了一个相当简化的相位函数模型,为了简单起见,我们将每个体积视为各向同性(即均匀散射)。因此,下图所展示的云不会具有正确的相位函数:具有前向和后向散射峰值。话虽如此,我们看到在很短的时间内本方法实现了无噪声图像,该图像对于相机和灯光动画都完全稳定。关于右侧的图像,路径跟踪方法没有利用多重散射预期解决方案的低频特性。每个像素都在解决自己的问题,这导致进行了大量不必要的计算。在图像仅为960×540的设置中,使用右侧的技术让渲染在±2小时内收敛可能不成问题。问题是大多数动画和实景电影现在都以4K渲染,这意味着像素增加了16倍,因此需要32小时才能渲染一帧。即使假设工作室可以在渲染农场中使用无限的并行渲染能力,这种周转时间也确实会开始损害生产。

Moana Cloud 1/4 Res渲染,具有2400万体素,比较了LightGraph和RenderMan 23.2。如右图所示,云的物理性质使得蒙特卡洛路径跟踪很难在合理时间范围内收敛
2. 爆炸
渲染爆炸是一个非常昂贵的过程,因为体积光投射的软阴影嵌入在高度非均质的密度场中。爆炸内部发出的大多数光都被密度吸收。只有靠近体积边缘或低密度区域发出的光才能在被吸收之前传播更长的距离。这是一个使用传统路径追踪处理起来非常复杂的情况,因为大多数路径都无法将相机与自发射光连接起来。这个问题下面这张图中间渲染中尤为明显。这种高频噪声最终可以使用方差阈值自适应采样来清除,但该过程需要很长时间才能达到收敛。另一方面,我们的方法将能够通过调整用于估计多重散射的核的大小来捕获短路径的贡献。较长的路径也将使用SPF进行适当近似。
对于每次迭代,在当前图的有限可能路径集中,光将被使用遮挡最少的路径进行散射,这使得我们的方法在只有少数非常具体的路径会对最终结果产生重大贡献的情况下特别有效。使用我们的方法,只需几次迭代(+25)就可以获得非常可信但有偏差的解决方案,但就如同前文所讨论的那样,在体积场动画的情况下结果会不稳定。这个动画场景需要500次LightGraph迭代才能达到稳定的无闪烁解决方案。

渲染具有3100万体素的爆炸
3. 上帝光
下面这个用例可能是单次散射方面最具挑战性的,因为光学薄介质填充了大部分屏幕,我们可以看到光束从一个云层流向另一个云层。在这种情况下,多重散射主要出现在光学厚区域,例如底部和顶部云层。多重散射的贡献在像这样的背光设置中尤其重要,因为它提供了有关体积物体的深度和整体形状的重要信息。

3个定向光,Iterations:25, Points Per Kernel:2, Scatter Scale:3, Scatter Density Scale:1.0, Scatter Density Min:0.05, Scatter Density Mask Power:0.25, Volume Color:1.0, Scattering:1.5
使用RenderMan渲染的图像即使渲染时间几乎增加了两倍,仍然非常嘈杂。他们的路径跟踪版本无论其贡献如何,都会均匀地计算任何地方的多重散射。在现实世界中,这个场景将分为至少两个渲染过程,以便正确控制。

渲染具有6500万体素的God Rays,对比了LightGraph和RenderMan23.2的2次多重散射反弹
4. 烟柱用例
该用例的特点是烟柱具有波长依赖性,当光线散射通过体积烟介质时,光线的颜色会发生变化。RenderMan的图像包含大量高频噪声,类似于前面示例中的噪声。更具体地说,对于这个场景,我们看到感知噪声被烟柱的光谱变化散射放大,噪声不再像前面示例中那样是单色的,这使得它更加明显。对于左侧的图像,我们的方法通过将多重散射分量乘以散射参数的倒数来解释这个矢量值散射,从而给出预期的色调。

3800万个体素的烟柱渲染,RenderMan中光谱变化散射会增加感知噪声水平渲染规格:3盏定向光,Iterations:500, Points Per Kernel:2, Scatter Scale: 2.0, Scatter Density Scale: 1.0, Scatter Density Min:0.075, Scatter Density Mask Power: 0.25, Volume Color:(0.8, 0.9, 1.0), Scattering: 0.75
5. 积雪
这个案例中尝试使用高密度参与介质来近似数百万个单个冰晶的光传输,LightGraph允许我们能够毫不费力地单次散射的体积密度与多次散射的体积密度分离,因此我们可以避免创建显式表面来模拟雪。

LightGraph渲染雪景模拟
下面左图显示了雪的详细表面,该表面由非常高密度的体积加上软的多重散射来近似,后者通过将密度值缩放0.001以获得。这种分离再混合在路径追踪是不可能的,从而不得不用一些妥协的手段解决。

六、限制和待优化点
尽管与目前生产中使用的方法相比,这种方法已被证明非常强大,但它仍然有相当多的局限性。在本节中,我们将讨论系统的弱点以及可以对当前架构进行的改进。
1. 密度场掩码
为了减少内存使用量和计算时间,我们将多重散射存储在低分辨率网格 (MSG) 中,因为它仅包含低频信息。为了获得正确的结果,我们仍然需要在渲染时使用高分辨率密度网格作为MSG的掩码。这种掩码操作在大多数情况下会产生正确的结果,但也可能会引入一些伪影。在爆炸场景中,我们观察到爆炸底部的多重散射非常弱,而自发光贡献显然非常重要。当应用密度掩码时,它会降低低密度区域的多重散射贡献,从而导致这些区域的估计有偏差。
2. 屏幕空间和世界空间对比
该解决方案在开始实际逐像素渲染之前,预先计算整个体积的多重散射。这在渲染体积填充大部分帧的情况下非常理想。但如果我们只能看到渲染体积的中一小部分,也仍然需要计算整个体积的多重散射。同样,如果我们考虑渲染由数千个云实例组成的完整云海,其中一些云仅作为子像素对象可见。在该方案下要做到这一点的唯一方法是计算当前渲染队列中云的MSG,然后尽快从内存中清除这些数据,从而为下一个队列的MSG腾出空间。这应该可行,但肯定会比传统的路径跟踪需要更多的内存。
3. 不相连的介质孤岛
生成图表时可能出现的一个问题是存在不连续的岛状结构。在由三个不连续部分组成的云的场景中,其中一部分接收强烈的直接照明(见下图)。我们可能希望第一部分云将光散射到没有接收直接照明的其他云部分。事实证明,由于点云仅散布在密度大于0的体素内,并且禁止超出一定搜索半径的连接,因此两个不连续的密度岛状结构很可能在其LightGraph中也不连续,这将阻止它们在密度岛状结构之间传输辐射。LightGraph不使用点填充空白空间的原因是为了将点云分辨率集中在最重要的地方,因为点数上限为750。可能有一种方法可以连接这些密度岛状结构而不会在空白空间中浪费点,但在撰写本文时尚未找到优雅的解决方案。

4. 使用缓存进行序列优化
我们的方法以每帧彼此独立的方式实现。根据需要渲染的帧序列,可以进行一些进一步的优化。将中间步骤缓存到磁盘可以在渲染序列时节省大量时间。在体积和光照静止而相机移动的情况下,可以将MSG写入磁盘,然后为后续帧读回。因此,整个序列只需要计算多重散射一次即可,并且每帧只需要重新计算一次散射。在低分辨率设置下,这甚至可以接近实时性能。在体积是静态但相机和照明是动态的情况下,在将多重散射烘焙到网格之前,只需重新计算顶点照明计算和辐射扩散步骤,就可以重用生成的LightGraph迭代。通过对整个序列计算一次多重散射估计的缓慢部分,这仍然可以节省大量计算量。
5. 随机游走
研究随机路径生成而不是依赖最短路径查找将会很有趣。这肯定会消除很多限制,例如每次迭代的点数,也可以产生一个统计上更合理、偏差更小的解决方案。另一方面,这种变化也可能导致噪声大幅增加,并降低全局性能。由于解决方案是使用高斯核光栅化为网格的,即使我们使用类似的启发式方法来确定光路,仍然可能有比路径追踪更快地收敛的方法。
6. GPU版本实现
随着最近一波渲染器移植到GPU,我们已经看到GPU可以大大加速可并行算法,其速度远远超过使用最好的CPU所能达到的速度。看看能获得怎样的改进将会很有趣,因为一些场景在我们当前的实现下已经接近实时性能。这可能为交互式应用程序打开可能性,以查看和操作使用多重散射渲染的体积。
7. 考虑几何遮蔽
由于时间限制,系统中尚未实现几何遮挡,但扩展应该相当简单。在执行算法的Raymarch Graph Edges步骤之前,只需将LightGraph的每个边缘投射到场景中的几何图形上即可。如果光线击中位于形成边缘的两个点之间的几何图形,则透射率应设置为0,这相当于光线行进无限密度的体素。然后,SPF算法将避开此边缘,就像它通常会避开非常遮挡的边缘一样。MSG的低分辨率可能会导致遮挡物表面周围漏出少量光线,但这不会产生任何明显的伪影。
8. 各项异性相位
我们的方法目前不支持各向异性相函数,因此将所有体积视为各向同性。做出这一选择是为了简化系统,但这也可能是一种直接的扩展。最短路径查找解决方案只需要考虑相函数,同时通过查找连接边之间的角度来评估图的不同分支选项。这肯定会增加计算方面的负担,但使用当前架构实现应该不会太难。
七、方案总结
本文引入了LightGraph方法,它使用SPF(最短路径查找)来近似大光学厚度和薄非均匀参与介质中的多重散射。该方法需要少量的预计算,在几秒钟内(而不是几个小时)就可以估计出多重散射。用户参数的数量保持在最低限度,同时仍保持非常高的灵活性。通过依靠高效的光线追踪技术来评估单次散射,并使用近似值来估计多重散射,以便从这两种技术的优势中受益。以上实现主要基于一个合理的假设,即多重散射是一种非常低频的现象,这使得它特别适合密度估计算法。实验表明,这种技术可以产生视觉上引人注目的无噪声图像,而计算成本仅为蒙特卡罗积分的一小部分,这使其成为视觉效果行业的潜在实用解决方案。对于LightGraph,这里选择了偏差而不是方差,灵活而不是简化,并且“好看”而不是物理精确。
参考
《Precomputed multiple scattering for light simulation in participating medium》
《Real-time multiple scattering in participating media with illumination networks》
《Flux-Limited Diffusion for Multiple Scattering in Participating Media》
《Deep scattering: rendering atmospheric clouds with radiance-predicting neural networks》
《Efficient simulation of light transport in scenes with participating media using photon maps》
《A lighting model for general participating media》
这是侑虎科技第1806篇文章,感谢作者Angelou供稿。欢迎转发分享,未经作者授权请勿转载。如果您有任何独到的见解或者发现也欢迎联系我们,一起探讨。(QQ群:793972859)
作者主页:https://www.zhihu.com/people/cong-ba-luo-ke-dao-lang-man-de-ni
再次感谢Angelou的分享,如果您有任何独到的见解或者发现也欢迎联系我们,一起探讨。(QQ群:793972859)