image-20240913001739279

使用边界体素采样的实时路径引导。UCSD Tzu-mao Li组的工作,2024年SIGGRAPH。

实时渲染由于相比于离线渲染,其计算的预算都比较低,一般都会重用之前在时间上和空间上的信息。光线追踪技术一般是通过对光源采样和对bsdf进行采样,但是对于某些特定场景(比如全是间接光照照亮的场景),bsdf采样和光源采样的表现并不好。路径引导就是利用之前的采样信息,来引导光照向之前采样到光照的部分采样。这篇论文的方法VXPG (voxel path-guiding algorithm)就是利用空间上的采样信息,进行guiding。

ABSTRACTION

关键思想:

每个shading point都有所在的体素数据结构,为了从数据结构中对一个shading point进行采样,我们需要选择一个对该点有高贡献的体素。

为了在考虑可见性的同时对体素进行重要采样,我们采用了离线多光渲染技术,通过对shading point和体素进行聚类。

最后,我们在考虑几何形状的同时,对所选体素进行无偏采样。

效果:与其他实时路径引导和虚拟点光方法相比,VXPG在等时间对比下的感知误差明显降低。

其他特点:方法不依赖于时间信息,但可以与其他时间复用采样技术(如ReSTIR)一起使用,进一步提高采样效率。

1 INTRODUCTION

实时渲染具有复杂可视性和强间接光照的场景需要找到良好的重要采样分布。路径引导技术是一种流行的离线渲染重要采样方法,但直接应用它们特别具有挑战性,因为实时计算预算只允许每帧每像素进行一到两个光路采样来学习采样分布。

因此,实时渲染方法通常严重依赖于时间信息,但这可能导致时间伪影和在复杂动态场景下缓慢的引导分布适应。图显示了一个具有挑战性的能见度的例子,其中所有的光路都需要穿过半封闭的门来照亮场景,大多数样本不能帮助定位稀疏贡献。

!

在本文中,我们提出了一种新的实时路径引导方法,体素路径引导(VXPG),它使用入射辐射分布的有效表示,在有限的采样预算下易于学习,并且不依赖于时间复用。

步骤:

  1. 构建体素数据结构,存储每次的辐射度和几何信息
  2. 在shading point采样的时候,先采样一个voxel,再射出从shading point到voxel的线
  3. 仅使用辐照度信息从体素中采样是次优的,因为它忽略了可见性和材料。此方法“对阴影点和体素的聚类”并“构建采样分布”。
  4. 问题:
    1. 我们需要在体素中计算光线落在表面上的概率密度,这对于实时渲染来说是难以处理的。
    2. 体素表示的有限分辨率会导致光线错过内部的实际几何形状。
  5. 解决:
    1. 为了解决这个问题,我们为每个体素存储几何体的边界体积。然后,我们提出了一种无偏和高效的采样策略,从边界体所包含的立体角进行采样

因为使用了irradiance引导,所以在caustic的情况下可能不太好(只计算单次反射的局限性

效果:比其他试试路径追踪和虚拟光源技术相比误差更小。而且不依赖于时间上的重用(与传统实时光锥相比

贡献总结:

  • 我们引入了一个边界体素数据结构,该结构存储辐照度和几何信息,以便在所有阴影点上重用信息以进行实时路径引导。(把信息放在体素里面

  • 为了从一个阴影点采样一个体素,同时考虑到可见性和材料,我们采用离线多光采样方法来实时聚类阴影点和体素对。(把体素当成光源了,因为光源太多所以沿用之前的离线manylight方法cluster

  • 我们提出了一种高效且无偏的方法来对边界体素内的点进行采样,同时考虑到体素内的几何形状。(貌似就因为后面有visible判断

Path guiding

  1. 老pg是把信息放在shading point的球面上
  2. 去年的是把信息放在空间里面,“焦点”,而且没有相交这种信息
  3. 这篇文章是把信息放在光源的目标表面上

Virtual point lights and many-lights sampling

虚拟点光源vpl:类似于bdpt/pm,把第一次间接光照点当成点光源。

一些方法通过采样光传输矩阵来聚类vpl,其中矩阵的每个元素都代表了光对像素样本的贡献。我们在实时设置中采用光传输矩阵采样方法,从阴影点重要采样一个边界体素,同时考虑到可见性和材料。

这篇文章是把虚拟点光源扩展成了一个体素

3 BACKGROUND

先是经典介绍一下kajiya。致敬经典,怀念1986那个纯真的年代!然后顺势引入mc积分。顺势讲讲重要性采样的问题,就是为什么我要path guiding它。

然后就是说path guiding。path guiding需要一个7d函数,对于x,链接wo相机,wi射向y的概率。这里只用5d,也就是对于一个空间shading point点x,射向wi的概率。对于目前来讲,实时技术使用pg,还是不容易的。

4 OVERVIEW

学习p(y)被所有shading point共享,而不是学习p(wi|x)(这下学的是3d了,一个irradiance的场

我们的方法有两个优点:首先,空间分布自然地消除了采样期间的视差问题;其次,由于其降维,需要更少的样本来学习分布,因此可以在每一帧从头开始重建,以快速适应动态场景。(说白了就是把工作放到guiding之后了,不知道他有没有考虑到guiding之后发现遮挡的感受)他这时候又说了,之前的采样已经是经过遮挡判断的了,所以目前的结果应该是p(y|x)(如果我没理解错他的意思,这里有个问题,他应该对于每一个x维护一个py才行,不然所有x都是共用的一个y,但实际上安踏这么说,应该y和x分开弄成n个的数组才对

过程:

image-20240912191918000

  1. 构建体素数据结构,存储每次的辐射度和几何信息
  2. 在shading point采样的时候,先采样一个voxel。这一步处理可见性和bsdf
  3. 再采样出next point,这一步要保证快速也保证unbias

5 BOUNDING VOXEL SAMPLING

在5.1-5.3节中,我们讨论了VXPG算法的边界体素的构造和采样。我们将重点讨论首次反射间接照明的情况。然后,第5.4节详细介绍了将边界体素采样与BSDF采样结合使用多重重要采样,使算法具有鲁棒性。第5.5节讨论了将第一次反弹的情况扩展到直接照明,以及进一步的反弹。我们在补充材料中提供了实现的更多细节。

5.1 Construct Bounding Voxels

存储基本数据结构voxels: $v_i$

表面: $M$

部分表面:$M_{v_i} = M \cap v_i$

每个v都有irradiance $I_i$和AABB盒$b_i$

光注入(维护$I_i$)

通过追踪来自相机的路径来注入光线,并在间接反弹的第一次撞击处放置虚拟光。这些点,我们表示为x2,保证对图像有贡献,因为它们从一些阴影点可见。特别是,我们为每个着色点跟踪BSDF射线,并将顶点x2的辐照度填充到x2所在的体素中。我们定义体素辐照度Ii作为注入到它的所有顶点的平均辐照度:

image-20240912200314788

n是射入体素的顶点数量。E是体素中每个点的贡献。

几何注入(维护$b_i$)

如图所示,这里作者使用的是c

a是体素直接做aabb

b是取三角形aabb和体素aabb的重合,但这不一定是最优

c这里是做了aabb最优裁剪

阴影是理想情况下不会对图像有贡献的部分,目前的aabb并不会考虑这部分的影响

d是现实情况下所有对图像有贡献的点的aabb,但是这种方法会出现非保守边界(有贡献的地方不会被统计)

e是理想情况下最优aabb

image-20240912195158940

因为我们需要的是保守边界,所以还得是选c,不能用d的方法

5.2 Voxel Selection

构建了voxel之后,就是如何在采样的时候选择的事情了。

根据重要性采样原理,理想状态下,对体素采样的概率应与体素中表面光对shading point x1的贡献成正比。

贡献:

image-20240912210244951

其中,y是next vertex,G是几何cos项,V是可见项(0或者1)

但这么做不满足我们实时渲染的条件,所以他借鉴了一下虚拟体素光源,只关注体素的$I_i$和$b_i$,简化了计算,让体素的概率与功率成正比,其中A是通过aabb估算出来的总面积(我们并不知道实际表面面积M,他这里取的aabb6个面中最大的一面作为$A(v_i)$):

image-20240912210618048

选择体素的时候一个一个地选择太麻烦了,所以先进行聚类,先聚出

超像素和超体素聚类。我们的方法基于SLIC超像素算法[Achanta et al . 2012]进行超像素聚类,并考虑几何相似性。同时,我们采用简化版的K-means算法,根据可见性和辐照度信息将体素分组为超体素。补充材料提供了聚类的详细信息。

image-20240912221952701

平均吞吐量估计。聚类后,我们估计每个超像素-超体素对的平均吞吐量。在准备阶段,我们计算出每个超像素和超体素对应哪些shading point和x2顶点。此阶段还为每个点添加表面法线信息,以便可以拒绝背面表面。然后,对于每个超像素-超体素对,我们在集群对中选择32对阴影点和x2顶点,并通过跟踪光线查询它们的二进制可见性(图5(c))。由于这些射线的两端预计会很近,所以它们通常是连贯的,且可有效跟踪。平均吞吐量为

image-20240912222008007

体素的选择。接下来,我们为每个阴影点选择体素。

首先,我们识别shading point的超像素SPi。接下来,我们选择一个超体素SVj,其概率与平均吞吐量和总功率的乘积成正比,即吞吐量*概率总和image-20240912223639538,它近似于产品样本的全部贡献:辐照度,可见度和BSDF项。最后,我们在超体素SVj中选择一个基于Φ的体素。

5.3 Intra-Voxel Sampling

如何在提速内部选择采样点

Bounding volume sampling 边界体采样

image-20240912225657647

a是方向采样,需要按照半球面将概率积分,然而这么做需要遍历整个voxel,不划算

b是下一个事件估计NEE,直接从表面找点,之后再来检查可见性

c是边界体采样,从体素的aabb上采样一个点,连接,检查hitpoint是否是这个点,如果不是就抛弃。

image-20240912230701837

现在采样的问题从如何voxel内部采样变成如何在voxel的aabb表面采样。

Spherical voxel sampling 球面体素采样

image-20240912231836930

使用球形投影的方法,把aabb投影到球面上,现在可以采样立体角了,其概率为:

image-20240912231937536

5.4 Multiple Importance Sampling with BSDF Sampling

与bsdf进行mis

5.5 Path Guiding for Further Bounces

作者说他们也试验了多次反射作为guid依据的方法,也是有助于采样的,但是这里为了实时渲染场景下的开销只用了一次

6 EVALUATION

测验平台:Nvidia Geforce RTX 3070,1280*720

只可视化间接照明,忽略了直接照明,以强调我们的算法在引导间接照明方面的改进(卧槽你的,还能这么玩

静态场景对比

每次都用VXPG和一个BSDF路径的mis,使得最终结果都是2spp,所有场景都是64^3的分辨率。

指标:FLIP

比较对象:

  • BSDF importance sampling,
  • real-time stochastic lightcuts (SLC) [Lin and Yuksel 2020],
  • stochastic substitute trees (SST) [Tatzgern et al.2020],
  • screen space path guiding (SSPG) [Derevyannykh 2022].

除了Veach MIS,都忽略了直接光照的影响

image-20240912233239226

image-20240912233300827

image-20240912233312944

图像质量比较:作者认为他们的更好,因为引入了可见度(费劲巴力地搞了次级光照和吞吐量,后面还要在采样的时候再比较一次,麻烦这么多,确实得有点用

image-20240912233619160

表格,表现最好的加粗突出显示。作者认为veach mis表现不好完全是因为场景不够复杂。

image-20240912234149596

后面比来比去得就不写了。

总之这玩意肯定是遇到场景变换了就会flush掉voxel里面的信息的。

虚拟点光源是从相机出发追踪的,也就是说,只有直接光照到的地方,才会成为虚拟点光源,否则就不是。

总的来说就是把当前的场景空间中的光照信息存储并且利用起来,作为未来采样guid的依据

这就是大名鼎鼎的西格rua夫吗,i了i了。