Stochastic Light Culling for VPLs on GGX Microsurfaces论文研读

本文介绍了针对光滑虚拟点光源(VPLs)的随机光剔除算法,以减少VPL对场景的影响范围,解决现有光剔除技术导致的图像偏暗问题。通过分析GGX微表面的BRDF,提出了包围椭球的计算方法,以更精确地限制VPL的范围。此外,结合交错采样技术减少每个像素中的VPL数量,实现高效的渲染。文中还讨论了方法的不足,如高度镜面表面、光滑对光滑的相互反射以及各向异性反射瓣的问题,指出未来可能的研究方向。
摘要由CSDN通过智能技术生成

前言

好久没写博客了,今天来共享一下最近研读的一篇论文吧,文章中[***.pdf]为参考文献可自行谷歌学术下载。因为本人还是个图形学菜鸟,所以有什么问题希望大家多多指正。

Stochastic Light Culling for VPLs on GGX Microsurfaces

词汇解析

VPL

VPL - virtual point light 虚拟点光源

以虚拟的点光源为间接光提供光照。可以在场景中分布多个虚拟点光源,对每个点光源的亮度都设置最大限度,这样就可以模拟在空间中传播的间接光。核心观点是,一般的光传输问题可以近似为计算许多虚拟点光源的直接照明的简单问题。

路径跟踪通过从相机开始跟踪光线来构建路径。在与场景的每个交点上,通过在交点表面上方的半球上随机采样一个出射方向(通常在每个交点上也估计直接光照)来继续路径。基于路径跟踪,双向方法跟踪摄像机子路径和光子路径,然后(确定地)将它们连接起来形成完整的路径。

Instant Radiosity (IR)是一种以特定方式构造这两组子路径的双向方法,如上图2所示。首先,生成并存储一组任意长度的光子路径[问题6]。为子路径上的每个顶点(不是路径上的每个点),会完整地储存局部环境:位置、法线、入射方向、BRDF和当前“通量”(即发光光源的辐射通量乘以顶点的吞吐量除以该点的路径的概率密度)。其目的是,为每个顶点存储足够的数据以计算从该顶点向任何方向散射的出射照度。如果按照这种思维,我们可以放弃原始路径的概念,而将顶点建模为一种不同寻常的点光源。由于这些不是场景中的物理光源,我们称之为虚拟点光源(VPLs)。

为了完成IR算法,在第二阶段为每个像素构造相机子路径。因为光的子路径是任意长的,所以只考虑长度为1的摄像机路径就足够了。然后,像所有的双向算法一样,IR将这些摄像机子路径的顶点连接到光路径的顶点,形成完整的路径。但是,由于VPL的生成是预处理过程,所以这个连接步骤与VPL对第一个摄像机命中点的直接照明相当。

一个基本的VPL照明方法总结如下:

第一阶段:生成VPL

    在场景中随机选择一个主光源,随机采样一个位置 x \boldsymbol{\mathbf{x}} x和方向 ω \boldsymbol{\omega} ω(如果不处理直接照明,在此位置创建一个VPL)。

    追踪射线 x + t ω \boldsymbol{\mathbf{x}} + t\boldsymbol{\omega} x+tω。如果它与一个表面相交,那么在这个相交位置创建一个VPL

    使用俄罗斯轮盘随机决定是否终止路径。如果继续,则采样输出方向,基于BRDF和方向更新路径吞吐量,并继续跟踪。

第二阶段:使用VPL渲染

    为一个表面点着色,只需遍历所有VPL,测试其照明是否被阻挡,如果没有,计算各自的贡献。

[Scalable Realistic Rendering with Many-light Methods.pdf]

GGX

GGX是一种更精确的微表面分布函数,是一种描述微表面法线方向分布的函数,可对于表面粗糙的半透明物体和表面粗糙的不透明物体均可适用。

https://www.jianshu.com/p/be4f025aeb3c

Caustics

Caustics(光焦散)是由曲面或物体反射或折射的光的聚合,或该光的聚合在另一表面上的投影。光焦散是每条光与之相切的曲线或表面,将光的聚合线的边界定义为聚光曲线。因此,在相邻图像中,焦散可以是光斑或它们的明亮边缘。这些形状通常具有尖锐的奇点。光焦散的常见情形就是水波纹。

https://en.wikipedia.org/wiki/Caustic_(optics)

Helmholtz Reciprocity

Helmholtz互异性:入射角和出射角互换,函数值保持不变。

https://blog.csdn.net/weixin_41036461/article/details/79846176

Lightcuts

Lightcuts(光剪切)是第一种实用的、可扩展的多光源方法。在需要计算光照的每个接收点,Lightcuts会根据分析的每个群集的误差范围和感知指标生成自定义的切割。首先,基于空间和方向相似性,将VPL先组织成二叉树。要为接收点选择一个片段,我们从一个简单的粗略聚类开始,例如将所有灯光放在一个聚类中。这对应于仅由光树的根节点组成的剪切。然后,我们迭代地选择当前剪切中误差范围最大的聚类,并对其进行精炼以替换其在光树中的孩子。重复此过程,直到剪切中所有聚类的误差范围低于基于感知的阈值(通常设置为总数的2%)为止。剪切的大小通常仅取决于VPL的数量,与完全评估相比,随着VPL数量的增加,剪切速度会大大提高。使用分析误差界限还可以确保始终找到并评估最重要的VPL,从而使估算更加可靠。 Davidovic描述了渐进的、对GPU友好的Lightcuts变体。

然而,使用误差界限也有一些缺点。误差边界忽略了遮挡,并且通常过于保守,导致比最优剪切更大。此外,为新的材质模型开发良好的误差界限是具有挑战性和困难的。Lightcuts也没有利用附近接收点的剪切通常非常相似这一事实,而是为每个点从头生成一个剪切。

[Scalable Realistic Rendering with Many-light Methods.pdf]

[Lightcuts A Scalable Approach to Illumination.pdf]

阴影遮罩函数

masking-shadowing function即阴影遮罩函数(也称为可见性函数),是描述光线从入射到出射的过程中,有多少比例被微表面自身的凹凸不平遮挡主了。这部分和法线分布函数很像,依据的是表面的粗糙程度。为了准确描述,首先需要这样的一个函数:给一个方向,获得微表面在这个方向上被自遮挡的面积的比例。

[Geometrical shadowing of a random rough surface.pdf]

[Understanding the masking-shadowing function in microfacet-based BRDFs.pdf]

相关算法

光剔除技术

为了渲染虚拟点光源,并且限制这些点光源的影响范围,就需要对其进行光剔除。现在主要有以下几种光剔除算法:

溅射

splatting技术又称为溅射技术,核心思想是把数据场中每个体素看作一个能量源,当每个体素投向图像平面时,用以体素的投影点为中心的重建核将体素的能量扩散到图像像素上。这种方法之所以叫溅射是因为把能量由中心向四周逐渐扩散的状态形象地比喻为溅射的雪,就好像把一个雪球(体素)扔到一个玻璃盘子上,雪球散开以后,在撞击中心的雪量(对图像的贡献)最大,而随着离撞击中心距离的增加,雪量(贡献)减少。

在此论文中提出了一种包围椭球的方法。

目标是计算一个简单的有界区域,该区域之外的光照低于阈值。如上图3所示,对于漫射像素光,这个区域是蛋形的,而对于光滑的表面,其形状类似于光子叶瓣。注意,这些表面是包含空间衰减的等照度面,而不是发光的极坐标图!

出于实际的原因,我们在这两种情况下都使用椭球作为界。对于每个像素的光,我们必须计算椭球参数,并相应地转换一个球面三角形网格来减少三角形数量。

http://blog.sina.com.cn/s/blog_76373c430100yxjd.html

[Splatting Indirect Illumination.pdf]

分块剔除

tiled culling技术又称为分块剔除技术,该方法首先是将屏幕分成小块(比如16*16pixel),每个小块为一个视锥体;在每一个视锥体中,根据ZBuffer得到每个Tile的MinZ和MaxZ(depth bounds),用MinZ到MaxZ这片区域对光做交点测试(一般使用compute shader)——点光源只需要position和range,spotlight也用球来做剔除bound;剔除后,每个Tile里面的光的index写入list,得到Tile个光源index的list,找出场景中那些对当前Tile有贡献的光源,然后对每个Tile中的pixel,只需要计算其对应的Tile中light list内的光源对该像素的贡献;之后进行color pass。

Advancements in Tiled-Based Compute Rendering里面介绍了两种剔除方法,一种是视锥体剔除,一种是AABB剔除,AABB剔除结果好一些

https://blog.csdn.net/wolf96/article/details/85541991

http://loongstudio.com/wangkan/?p=1657

[Tiled Shading.pdf]

聚类着色

clustered shading技术又称为聚类着色技术,核心思想是给light list的划分增加了一个维度,即depth(当然也可以再增加normal的维度),它根据view frustum的zmin,zmax把场景进一步根据depth划分成若干个slice(基于指数的划分,通常16个),然后在每个slice上对场景中的所有灯光进行light culling,具体的计算方案和tiled based提到的一些方案类似,只是这里不再需要处理深度不连续的问题。

https://zhuanlan.zhihu.com/p/92165837

[Reflective Shadow Map Clustering for Real-Time Global Illumination.pdf]

交错采样

interleaved sampling(即交错采样技术)可以用于减少每个像素当中VPL的数量。

原始的交错采样

交错采样的基本思想非常简单,而且从图1中可以立即看出:在累加缓冲区方法中,不规则的采样模式固定在一个像素上,因此对所有像素周期性地重复采样,从而具有较高的像素间混叠的可能性(参见图1a)。对于交错采样,选择覆盖多个像素的不规则偏移模式。通过周期性地重复这个模式,规则的网格仍然像图1b中强调的那样持续存在,但是相邻的像素被不同的模式采样。注意,虽然规则网格的数目增加了,但有效地降低了像素间混叠的可能,并且样本总数保持不变。

[Interleaved Sampling.pdf]

[The Accumulation Buffer: Hardware Support for High-
Quality Rendering.pdf]

交错样本模式的非交错延迟着色

现在,我们使用缓冲区分割/聚合技术来展示延迟着色的扩展。它们被限制为低分辨率的分块子缓冲区,而不是在整个G-buffer上执行着色操作。与标准的延迟着色相比,增加了三个通道。第一个将G-buffer分成几个子缓冲区,第二个在着色阶段后重建交错采样模式,第三个利用相邻像素的空间相关性来混合不相关的光照对像素的贡献。因此,渲染管道现在被分解为5个步骤,如图3所示:

创建G-Buffer

在着色操作之前,首先创建三个分别包含位置、法线和颜色的浮点缓冲区(Gbuffer)。材料标识符等材料信息也打包在其余组件中。由于带宽的原因,精度被限制在16位,因此场景是有限的。

G-Buffer分割

初始的G-Buffer被分割成单独的子缓冲区。首先计算两个查找纹理。第一个存储分块函数,第二个存储块转换函数。然后,两个fragment程序依次执行这两个函数。完成后,将子缓冲区平铺到与初始缓冲区大小相同的缓冲区中。

块拆分:一个简单的想法是将拆分操作限制在较小的2D块中,以增强数据局部性。因此,将初始G缓冲区细分为p * q个块,并将每个块拆分为n * m个单独的子块。如果块足够小,则在访问过程中,内存访问将保持一致。经过此阶段后,每个子缓冲区被细分为p * q个子块,分布在整个缓冲区中,如上图2.c所示。

块转换:要重建每个子缓冲区,另一阶段将执行交错的子块的转换(请参见图2.c和2.d)。再次强调,由于整个块被移动,因此存储器访问保持一致。

着色计算

为每个子缓冲区计算不同光源的贡献。延迟着色可能进行的任何操作仍然可用。确实,由于以前的G-Buffer被明确地拆分为较小的子缓冲区,因此任何延迟的着色器也可以通过将视口聚焦或在给定的子缓冲区上绘制四边形来使用。然后获得小的辐照度子缓冲区的图块(参见图3.c)。可能会注意到,通过在标准阴影贴图中展开半立方体(或立方体)并用小立方体贴图重新索引它,可以解决半球形(或球形)点光源的可见性。根据应用程序的不同,最终可以使用两种着色技术:SSM(带阴影贴图的阴影)是具有阴影贴图重新投影的阴影传递,而SNSM(无阴影贴图的阴影)是没有阴影映射的阴影传递,阴影贴图重新投影(可见性被忽略)。在这两种情况下,都会处理光泽的BRDF和漫反射的BRDF。

缓冲聚合

一旦完成了着色操作,就可以通过聚合子缓冲区来重构交错模式。此过程与缓冲区拆分过程相反(请参见图3.d),并且出于相同的原因,它以两个过程执行,即块转换过程和块聚合过程。

滤波

为了保证交互性和实时性,每个像素中都值计算很少的光源贡献。如果将滤波应用于屏幕的连续区域,则可以利用场景的几何相干性来虚拟计算每个像素中有许多光源的贡献。

[Non-interleaved deferred shading of interleaved sample patterns.pdf]

主要目标

由于现存的光剔除技术需要限制光源的影响范围,所以会造成场景明显偏暗。

本文的方法为利用GGX微表面生成光滑的单反弹光焦散的实时绘制方法。该方法是基于VPL的随机光剔除,这是一种无偏差的剔除方法,可以随机确定每个VPL的光影响范围,并且是对每个VPL的包围椭球进行分块剔除。包围椭球的计算使用的是一种推导出的简单分析方法,可以为GGX微表面上的VPL生成更紧密的边界椭球。对于成千上万的VPL时,该方法结合交错采样比基于保守光栅化的聚类着色的速度更快(聚类着色法是最新的支持剔除边界椭球的技术)。

本文主要有如下贡献:

    将随机光剔除方法推广到光滑VPL的方向相关影响范围。

    从GGX微平面BRDF反射的VPL中解析地推导出光范围的包围椭球体。

    本文提出了一种有效的包围椭球体的分块剔除算法。

本文的绘制管线如下图2所示。上诉贡献在绘制管线中的橙色部分实现了。

算法细节

3 光滑虚拟点光源的随机光剔除

3.1 随机光剔除

随机光剔除算法是通过俄罗斯轮盘确定不重要[问题5]光源的影响范围来随机地删除不重要的光源。对于每一个光源,俄罗斯轮盘通过其在着色点的概率来决定是否剔除这个光源,这个概率与辐射率成正比。对于每一个点光源,其在某个着色点的辐射率如下:

L ( ω o , l ) = I ( ω o ) l 2 L\left(\boldsymbol{\omega}_{o}, l\right)=\frac{I\left(\boldsymbol{\omega}_{o}\right)}{l^{2}} L(ωo,l)=l2I(ωo)

其中, I ( ω o ) I(\boldsymbol{\omega}_{o}) I(ωo)表示辐射强度, ω O ∈ S 2 \boldsymbol{\omega}_{O}\in\mathcal{S}^{2} ωOS2表示从点光源到着色点的方向, l ∈ [ 0 , ∞ ) l\in[0, \infty) l[0,)表示从点光源到着色点的距离。

在这篇文章中,使用如下的概率函数:

p ( ω o , l ) = min ⁡ ( I ( ω o ) δ l 2 , 1 ) p\left(\boldsymbol{\omega}_{o}, l\right)=\min \left(\frac{I\left(\boldsymbol{\omega}_{o}\right)}{\delta l^{2}}, 1\right) p(ωo,l)=min(δl2I(ωo),1)

其中 δ ∈ ( 0 , ∞ ) \delta \in(0, \infty) δ(0,)是一个用户自定义的参数(这篇文章用的 δ = 0.001 \delta = 0.001 δ=0.001)。

如果某个点没有被剔除的话(概率超过某个阈值),就会将它的辐射率除以概率值[问题1],如下所示:

L ( ω o , l ) ≈ { L ( ω 0 , l ) p ( ω o , l ) ( p ( ω o , l ) > ξ ) 0 (  otherwise  ) L\left(\boldsymbol{\omega}_{o}, l\right) \approx\left\{\begin{array}{ll} \frac{L\left(\boldsymbol{\omega}_{0}, l\right)}{p\left(\boldsymbol{\omega}_{o}, l\right)} & \left(p\left(\boldsymbol{\omega}_{o}, l\right)>\xi\right) \\ 0 & (\text { otherwise }) \end{array}\right. L(ωo,l){ p(ωo,l)L(ω0,l)0(p(ωo,l)>ξ)( otherwise )

其中, ξ ∈ [ 0 , 1 ) \xi \in[0,1) ξ[0,1)是一个统一的随机数。

随机光剔除算法中,对每一个光源都使用单个随机数 ξ \xi ξ;并且对于一个给定的光源,所有的着色点都会使用相同的 ξ \xi ξ。这样做的好处就是可以限制每个光源的影响范围,并且能够以无偏差的方式时利用现有的剔除方法。

3.2 虚拟点光源的BRDF相关影响范围

Tokuyoshi为了使用包围球和现有的块剔除方法,但却忽略了概率函数 p ( ω o , l ) p\left(\boldsymbol{\omega}_{o}, l\right) p(ωo,l)的方向性。这篇文章考虑了光滑虚拟点光源的方向性,如下图4所示:

所以,某个VPL的辐射强度计算如下:

I ( ω o ) = Φ f ( ω i , ω o ) max ⁡ ( ω o ⋅ n , 0 ) I\left(\boldsymbol{\omega}_{o}\right)=\Phi f\left(\boldsymbol{\omega}_{i}, \boldsymbol{\omega}_{o}\right) \max \left(\boldsymbol{\omega}_{o} \cdot \mathbf{n}, 0\right) I(ωo)=Φf(ωi,ωo)max(ωon,0)

其中 Φ \Phi Φ表示光子到达VPL处的辐射通量, f ( ω i , ω o ) f\left(\boldsymbol{\omega}_{i}, \boldsymbol{\omega}_{o}\right) f(ωi,ωo)是BRDF, ω i ∈ S 2 \boldsymbol{\omega}_{i} \in \mathcal{S}^{2} ωiS2是光子的入射方向, n ∈ S 2 \mathbf{n} \in \mathcal{S}^{2} nS2是VPL处的几何法线。因此,上图4所示的VPL的影响范围如下:

l max ⁡ ( ω o ) = p − 1 ( ξ ) = Φ f ( ω i , ω o ) max ⁡ ( ω o ⋅ n , 0 ) δ ξ l_{\max }\left(\boldsymbol{\omega}_{o}\right)=p^{-1}(\xi)=\sqrt{\frac{\Phi f\left(\boldsymbol{\omega}_{i}, \boldsymbol{\omega}_{o}\right) \max \left(\boldsymbol{\omega}_{o} \cdot \mathbf{n}, 0\right)}{\delta \xi}} lmax(ωo)=p1(ξ)=δξΦf(ωi,ωo)max(ωon,0)

其中 l max ⁡ ( ω o ) l_{\max }\left(\boldsymbol{\omega}_{o}\right) lmax(ωo)是BRDF( f ( ω i , ω o ) f\left(\boldsymbol{\omega}_{i}, \boldsymbol{\omega}_{o}\right) f(ωi,ωo))所反射的辐射率的等值面。为了绑定这个等值面,我们使用了与Dachsbacher溅射算法中使用过类似的椭球面。但与之不同的是,我们为GGX微平面的BRDF引入了包围椭球。

公式推导如下:


(字丑,见谅)

4 GGX反射的包围椭球

4.1 GGX微平面的BRDF

建模微平面的BRDF可以用来表示粗糙平面光的反射,BRDF计算如下:

f ( ω i , ω o ) = F ( ω i ⋅ ω h ) G 2 ( ω i , ω o ) D ( ω h ⋅ n ) 4 ∣ ω i ⋅ n ∥ ω o ⋅ n ∣ f\left(\boldsymbol{\omega}_{i}, \boldsymbol{\omega}_{o}\right)=\frac{F\left(\boldsymbol{\omega}_{i} \cdot \boldsymbol{\omega}_{h}\right) G_{2}\left(\boldsymbol{\omega}_{i}, \boldsymbol{\omega}_{o}\right) D\left(\boldsymbol{\omega}_{h} \cdot \mathbf{n}\right)}{4\left|\boldsymbol{\omega}_{i} \cdot \mathbf{n} \| \boldsymbol{\omega}_{o} \cdot \mathbf{n}\right|} f(ωi,ωo)=4ωinωonF

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值