交互式,光线追踪,全局光照
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
交互式全局光照使用快速光线追踪
摘要:
光栅化硬件为渲染动态场景提供了交互式的帧速率,但缺乏有效的全局光照模拟所需的光线追踪的能力。
现有的以光线追踪为基础的方法能产生高渲染品质,但对于交互式光线跟踪过于缓慢。
我们提出了一种新的并行全局照明算法,该算法是基于准蒙特卡洛积分的高效随机采样技术,它具有完美的尺度,最小的预处理和通信开销等优点,并受益于快速平行的光线跟踪所拍摄的光线相干组。
因此,允许随意更改场景,同时可以模拟包括面光源,间接照明,镜面效果和在交互的帧速率下焦散线的阴影的全局光照。
停止互动可以迅速地提供高品质的渲染。
1.介绍
全局光照有着广泛的应用。
它有助于获得虚拟物体的真实感图像,例如电影生产、设计过程、汽车和飞机公司的设计以及建筑学等方面。
对于交互变化的快速响应保证了设计过程的效率,此外更快的渲染技术降低了生产成本。
随着快速和廉价的光栅化硬件的发展,交互式3D 图形已成为一个主流特征。
虽然通过例如多纹理、顶点程序或像素着色器可以大幅度提高真实性,但由于缺乏光线跟踪功能使得全局光照的很难达到预期效果。
通常,更复杂的光照效果需要用已经存在的光照跟踪算法的预先计算,而这些算法开销非常大并且速度非常慢。
很明显,这种方法仅适用于静态光照中的静态场景,因此不能适用于在高动态环境下的交互式应用的需求。
快速和有效的光线追踪的研究彻底改变了的全局光照运行的环境。
即使在商用硬件上,光线跟踪在动态设置上实现了交互式的帧速率。
此外,新技术允许高效、可伸缩地在计算机集群上分配计算机资源。
我们可以想象到全局光照算法将同样得益于这些发展。
然而,这种快速的、分布式的光线跟踪的实现施加限制后与大多数现有的全局光照算法不兼容。
在第二部分我们将讨论快速光线追踪系统并重点讨论这些系统对全局光照算法的限制。
然后在第三部分我们将讨论在这些约束下以前的工作。
在第四部分找到解决问题的方法,在第五部分我们推导出在第四部分找到的方法的结果和优势以及在我们系统中的局限性。
2.快速光线追踪的限制
光线跟踪算法是计算机图形学中最古老和最基本的技术。
由于跟踪一条光线开销较大,再加上需要跟踪数百万条光线,因此计算单个图像需要数分钟到数小时的时间。
通过利用固有的并行性光线追踪,Muuss 和Parker等人已经成功地在超级计算机系统的共享内存上交互的执行大量的并行处理。
Wald等人表示,交互式光线跟踪同样可以在廉价的、商用的PC机上执行。
他们的执行是为使用重新排序的计算、优化的交集和遍历算法,细致的布局和核心数据结构对齐方式的高级缓存的表现所设计的。
这些技术为计算机提高了一个数量级以上的性能。
快速光线追踪在分布式内存环境下使用商用电脑和网络进行扩展而且效果较好。
分布式计算是通过一个基于平铺的负载平衡的客户端/服务器模型来实现,通过动态重新排序的计算来隐藏网络的延迟。
即使在数千万的三角形的场景中使用分布式的光线跟踪交互渲染的效果依然较好。
扩展系统控制动态的环境需要考虑到实际的使用者作为交互式应用的介入。
下一步要做的明显是使用快速光线追踪引擎加快那些现有的非常依赖光线追踪的全局光照算法。
然而,事实证明这并不像最初看起来那么简单,这些算法大多与如此快速的光线追踪系统的限制相抵触。
2.1性能约束
即使使用快速光线跟踪程序,全局光照系统局限于相当小的每帧光线的预算。
在目标分辨率高达640 ×480 像素时,每个帧包含大约300000 像素。
假设有一个16个处理器的Pc 网络和每秒500,000条
光线的处理器性能,这每秒一帧的全局光照估计仍然需要每个像素27条光线。
请注意我们正在计算特别的光线和不完整的光路径。
在实际中,甚至只有更少的光线可以找到,由于像阴影计算等其他的过程需求。
鉴于这种极低的采样率,我们只能关注全局光照的主要贡献,比如来自点或面光源、反射和折射,直接焦散线的直接和多反弹的间接照明。
我们目前不注重开销更大效果,例如光滑物体的反射或高阶焦散线。
一种基于纯蒙特卡洛技术的方法在这样低的采样率下容易受到噪声的影响。
在动态环境中,这种噪音变得更具有干扰性。
这种时间假象,应当小心避免。
一种合适的算法必须发送连续的光线组以实现最佳性能,因为光线跟踪引擎的加速主要取决于有效的缓存。
还有其他的开销,如双向反射分布函数的评价,样本的选择,甚至随机数的生成,都有可以成为新的瓶颈。
2.2并行与分布式计算的约束
基于价格和可用性的考虑,我们把目标网络定在廉价但又快速的标准网络组成的PC机上。
与共享内存的系统相比,这种低成本的设备的通信参数相差了几个数量级;它们带宽较低且延迟程度很高。
因此,所需的算法必须保持其带宽要求低,并且必须设法隐藏延迟。
虽然经典的光线跟踪并行化琐细,但是那些不自动保存的全局光照算法也一样,即使他们是基于光线跟踪的。
因此所有全局光照计算也必须分解成独立的工作在多个客户机上并行运行。
此外,负载平衡要求作业数目是明显大于处理器的数量,以便于动态地安排作业。
此外,该算法必须尽量避免同步跨越慢速网络,例如更新共享的数据结构,这将导致往返过程延误的开销。
在这方面许多现有的全局光照算法是有很大问题的,因为他们高度依赖全局数据结构,如光子图。
理想情况下,与客户端的沟通基于管道模型,所有的非现场数据是输入工作描述的一部分,然后通过管道将结果送回到接收机。
这种模式允许一个简单而有效地隐藏通信延迟。
2.3.交互约束
许多现有的算法必须在第一个结构可用之前先执行冗长的预计算。
这种摊销策略不适合交互式的应用程序,用户应该获得即时反馈。
自从几分之一秒内就能完成一个整体框架后,预处理必须限于每帧最多几毫秒的时间来完成。
此外,它可以被摊销到仅几帧,因为它可能在动态环境的交互变化中被淘汰。
但是,在静态的情况下,累积可用于提高全局光照解决方案的质量。
3.之前的工作
使用基于快速光线跟踪的交互式全局光照明技术必须同时处理前面章节里的所有约束。
然而,大多数现有的全局光照技术仅仅考虑了其中的一些约束且与其它的技术相冲突。
用于近似求解辐射方程全局解的日益复杂的算法被提出了,这些算法都基于有限元方法。
在漫反射的环境中,辐射度方法最先允许使用光栅化硬件进行走查交互,但它需要大量的预处理,因而它仅适用于静态场景。
由大量增加的场景更新而产生的交互改变迫使全局数据结构的操作代价趋于高昂且很难被并行执行。
虽然光栅化硬件支持基于有限元方法的交互式显示,但光亮和镜面效果只能被近似处理,或必须由单独的光线跟踪实现。
即时辐射支持方案不经过有限元离散化就可以实现交互式辐射。
场景中的光源由拟随机行走产生的点光源来近似,光栅化硬件也用此光源进行阴影计算。
虽然对环境的任意交互更改是可能的但一帧所需要的大量渲染计算把交互限制在了简单的场景中。
Udeshi 和Hansen改进了此方法,并且在一个超级电脑上通过光线跟踪算法实现了之前没有的反射和折射效果。
该电脑拥有多个图形管线且共享内存。
的虽然他们获得了可以实现交互的帧速率,但他们的主要缺点是扩展性较差,即使在共享的内存系统中,并且缺少像焦散这样的全局照明效果,图像的质量也受限制。
路径跟踪算法虽然可以正确地处理光泽和镜面效果,但是由于场景对视点具有依赖性,因此需要对每一帧进行重新计算。
经典的有限元方离散法被不那么令人讨厌的噪声取代,但随着时间的推移处理也变得比较困难。
通常可以采用增加采样率的方法把噪声降至可接受水平,这将导致帧速率远离实现交互所需要帧速率。
为了有效地渲染上述基于路径跟踪方法很难实现的焦散效果,我们引入光子映射方法。
这个利用直接
光进行效果模拟的简单的方法是有失偏颇的。
具体表现为高密集区域的焦散效果不明显,低密集区域的人工痕迹需要通过跟踪更多光线进行平滑处理或聚集。
利用辐照度的局部平滑特性,大大减少渲染时间的外推模式已经被开发出来。
然而,如9所示,大量重要的样本点集中在拐角处,且样本点的位置也是难以预测的。
这要求要么增加初始采样密度,当然这样计算代价高;要么在交互过程中由于物体的改变将产生大量的突出的人工痕迹。
此外并行的实现需要高昂的同步计算和通信以维护全局数据结构。
代价高昂的照明数据缓存的原则是允许用户获得可以互动的帧速率。
这被渲染缓存和在图像空间通过投影缓存数据插值方式实现重用前面帧结果的挂毯式数据结构所利用。
着色缓存执行对象空间插值方法需要一个本地参数由于较好的时间连续性,这些缓存交互地运行,然而,如果缓存不足的话将会导致失败,并且不能更新全局光照明的效果。
为了最小化人工痕迹插值只有代价高昂的密集采样方法可用。
这意味着需要一个长时间的设置来填充缓存。
4.算法
接下来我们提出一种满足第二部分约束下的全局光照算法。
它实现了交互式性能质量略有减少但能迅速生成高质量的解决方案。
为简洁起见假定我们熟悉光亮度的积分方程,并参考像例子中的标准文本。
光亮度 L(x, ω) (符号含义见图 1)在点 x ,ω方向的值为:
L (x,ω)
=L e (x,ω)+∫V (y,x )f r (ωxy ,x,ω)L in (y,x )G (y,x )dA (y )
S
≈L e (x,ω)+∑V(y j ,x)M j=1f
r (ωxy j ,x,ω)L j G(y j ,x)+1πr 2∑B r (z j ,x)M j=1f r (ωj ,x,ω)∅j (1) G (y,x )≔cosθy cosθx
|y−x|2,其中P ≔(y j +L j )j=1M 是用来设置点光源y j 和光亮度L j ;C ≔(z j ,w j ,∅j )j=1N 用来设置来
自w j ,z j 和流量∅j 的入射集散光子。
这些设置必须具有固定的最大路径长度的随机游走的帧至少每次生成一个。
在这个预处理步骤后,分散的光亮度只由可见性测试 V (y j ,x) 和光子查询决定,当|z j −x|≤r 时,B r (z j ,x)=1,否则B r (z j ,x)=0。
对于每一个像素发出的主光线,如果材料有一个扩散组件,交点就会被(1)照亮。
对于每个镜面和透明组件,这些光线的路径是由随机进一步跟踪一条散射的光线产生的。
如果随机决定选择了fr 的散射部分,那么这些路径都会被终止。
由此产生的终结点是由 (1) 照明和用传递函数沿路径衰减的。
拆分第一个交点的路径减少了可承受的开销(从(1)中可得至多3)的变化同时减少了材料的闪烁。
在没有互动时期,抗锯齿是由随时间的累积图像执行的。
图1 用到的符号
与双向路径追踪比较,(1)中的第一次求和使用只用到一个技术来生成路径空间样本。
对于大多数被我们的算法考虑在内的路径空间样本来说这种技术是最好的退一步来讲它至少足以生成它们。
当路径空间样本距离|y j− x |很小或者属于焦散线时是它的例外。
为了避免过度调制第一组通过剪辑到极小值的距离的一种有偏差的方式来控制。
由于第二组样本不能以这种技术生成,他们的贡献接近使用焦散光子图的第二个和。
为了在PC机集群上实现上述的算法的交互式帧速率,预处理必须不能阻止客户端同时必须避免相同结果的重复计算。
对于较好的交互式性能,进一步减小变化以减少人为噪声和提高效率很有必要。
下文将讨论这些改进。
4.1.快速焦散线
发射足够数量的光子在一个交互式应用程序中是可负担得起的,因为随机走动模拟只需要全部光线的一小部分的发射光线就行。
然而,用于存储与查询光子图的算法的速度太过缓慢而不能达到重建kd 树的光子图的交互式的目的,因为这样每一帧将不会摊销而最近的查询也跟发射几种光线一样开销较大。
因此光子映射仅适用于可视化焦散线,在那里通常光子密度相当高,它的密度估计可以用于固定过滤半径r。
假设光子是存储在一个分辨率为2r的三维规则网格中,那么只有8个像素需要查询。
因为在实践中只有几个像素会真正被焦散光子所占用,简单的哈希方案是用来避免存储完整的网格。
然后存储和散列这些光子相比于左平衡和遍历kd 树几乎可以忽略不计。
4.2.交错取样
为每个像素生成一系列不同的点光源开销太大,而使用相同的设置也会产生锯齿(见图2a)。
焦散光子图也引发了相同的争论。
另外,并行计算足够大的光子图以及结果的合并将会在渲染帧和减少可用网络带宽之前阻止客户。
归纳交错取样允许用于控制预处理开销和走样的比率:一个小的n×m块的每个像素分配不同的点光源的P k集和焦散光子(1≤k≤n•m)的C k。
在整个图像中填充这些块取代使用结构噪声的人为走样(见图2b)但是只有少数的n•m集的点光源和焦散光子必须生成。
由于这个交错的样本达到了更好的视觉质量,集P k和C k可以选择更小的P和C。
每个客户端通过本身和按需计算点光源的P k集和焦散光子C k。
任务的并行分配使得客户主要的处理等于ķ的像素为了考虑到P k和C k的缓冲。
由于全局集合P和C的交错同步采样已经被淘汰了,事实上客户端之间的网络通信是没有必要的。
不同的客户端只需要设置充当一个生成点光源和焦散光子整体设置的种子值的数k。
4.3.不连续缓冲
交互性的约束只允许少数预定的光线被发射,这导致了P k集和中等大小的C k。
因此方差非常高,为了去掉认为的噪声我们必须调低方差。
考虑到光线是分段的光滑的函数,通过不连续缓存可以有效地减小方差。
对于每个像素的服务器缓存,反射函数积累到终结点的视点路径,到那一点的距离,在那一点上的法向量和入射光的亮度。
辐照度值由点光源P k的贡献和焦散光子C k所组成。
而不是仅仅将辐照度和反射函数相乘,8个相邻的像素的辐射也被考虑进来了:局部平整度通过不同距离的阈值,中心像素的法向量数值的产生和每个相邻数据的检测。
如果检测到几何连续性,辐照度的相邻像素就会被添加到中心像素辐照度。
最终像素颜色由累积的辐照度乘于反射函数除以总辐照度的数量所确定。
(a) 没有交错的取样 (b) 5×5交错的取样 (c) 5×5交错的取样 (d) 5×5交错的取样 没有不连续缓冲 5×5交错的取样 3×3不连续缓冲 5×5不连续缓冲
图 2:交错采样和不连续的缓冲:除了预处理所有的特写和相同数量的光线已经呈现。
在a 中只有一系列点光源和焦散光子生成,而对于b )d )25个独立的交错点已经生成。
按照交错因素选择适当的筛选器大小完全移除结构的噪声的工件。
在局部顺利的情况下,这个过程隐性地增加了辐射采样率的9倍,同时由于相同因素减少了它的方差。
注意到没有额外的光线有为了使较大程度地降低噪声而发射,而是直接生成一个大于3×3的过滤器内核。
在不连续的情况下平滑是不可能的,然而剩余噪声被叠加在不连续而且非常少的可感知因素上。
由于只有辐照度是模糊,因此表面上的纹理细节被完美地重构了。
请注意模糊是在图像空间中做的并且受到过滤器尺寸的限制。
包括直接光照计算成不连续缓冲的平均化处理使人们能大大减少被拍摄的阴影光线数目,但是直接阴影略有模糊。
类似于辐照缓存方法,几何不连续性检测可能会失败。
然后同样的模糊假象变得可见,例如在阴影边界或轻微偏移平行的平面对象。
交错的取样和不连续缓冲完全相互补充 (见图 2d ),但需要筛选才能在显示服务器上显示。
因此增加的数据量必须通过网络发送到服务器。
如果量化法线、距离(每个16位)、颜色值(32位的RGBE 格式)和压缩使用LZO 库就会有助于降低带宽需求。
相比辐照缓存,不连续的缓冲样本的空间更加均匀同时在动态环境中遇到典型的闪烁的假象。
此外在渲染之前没有通讯需要传播辐照度的样品。
4.4.最低限度的随机化
在计算机图形学中的被积函数是平方可积的,通常在高维情况下包含未知的不连续性。
因此蒙特卡洛 方法是适合于数值积分。
由于纯蒙特卡洛方法是相当缓慢的因此我们使用更有效率的随机准蒙特卡洛积分。
与分层抽样相比这种集成方法节省了大约 30%的计算时间,而且方差比以前小很多,比如在噪音方面。
这个方法包括使用评价函数
∫f (x )dx ≈1r [0,1)s ∑1n r i=1∑f(x i ,j)n−1j=0, 对于固定的i ,样品x ij 是低偏差的(其定义见注释20)而对于固定的j ,样品x ij 是随机实现的独立集。
与独立的随机样本相比低差异保证了样本能获得更好的均匀分布。
这意味着,良好的分层性能保证更快的收敛。
另一方面独立性使得估计函数得到适用于所有的平方可积函数得真实的蒙特卡洛值,此外可以用于评估估计值的方差。
在整数运算中,Sobol 的确定性的低差异序列可以用很少的几行代码来生成。
在浮点数转换之前,仅仅通过对他们进行异或运算和随机位向量这些点被随机的生成。
取Sobol 序列的前n 个点,上述方案中的r 独立随机由 x i,j ≔((232∗a j )xor b i )∗2−32 得到,其中b i 是r 独立随机位向量。
请注意这种随机化方案保留了这些点较好的均匀性属性。
事实上只要选择r = 1随机实例就足以获得有效的蒙特卡洛估计值,而 r = 2 已经使估算产生误差(见注释29)。
通过随机化这种简单并且最小的计划,利用蒙特卡洛方法几乎可以完全避免固有的方差和噪声。
制表Sobol 序列提供了分层样本的生成速率比伪随机数发生器与分层抽样相结合后的速度快得多。
图3:两个简单的测试场景分别由一个玻璃球和800至4000个三角形组成的玻璃蛋。
它们场景呈现在3.3和2.5帧每秒的8 个客户端上。
在该算法中为每个可识别的k分配一个随机的低差异序列的后续子序列。
这些样品用于生成点光源的P k集和集散光子C k。
在几何连续的情况下,不连续缓冲组装相邻像素的样本,例如在加入不同的子序列。
由于这些子序列是大序列的一部分,样品几乎能完全相互补充因此能更好收敛。
为了避免开销较大的高维低差异序列计算,我们需要填充复制样本。
对于随机化,每个客户端需要一个相同的每帧只要几个伪随机数的流,这种流由同一个在每个客户端上的伪随机数发生器所创建的。
从而避免了伪随机数生成的任何内在并行化问题并且在渲染过程中不需要通讯。
为了避免由于点光源P k集和焦散光子C k的改变引起的闪烁,在交互中每个帧使用了相同的随机数和低偏差点。
5.结果和讨论
在我们的实验中,我们使用了一个双处理器机群集,每台机器都有两个AMD AthlonMP 1800 +Cpu 和512 MB 的RAM。
所有的机器都连接到一个全切换的100 Mbit 以太网。
为了处理发送到服务器的大量像素数据,单个的千兆位上行链路与交换机相连,否则主机就等同客户端了。
当光线跟踪引擎处理把物体显然地应用到全局光照明的改变时,我们可以交互方式地操纵下面所有的例子,这些例子都绘制在利用 3 × 3 间隔采样与 3 × 3 不连续缓冲相结合的方法渲染的分辨率为640*480的屏幕上。
在交互期间每一帧的照明效果都需要重新计算。
如果交互停止,融合的高质量的图像在1-2 秒内通过积累连续帧获得。
图4
在图 3 左图中,一个简单的房间被位于桌子上方的天花板上一个单一面光源所照亮,桌子上的玻璃球向外发射着焦散光。
全局光照效果只在8个子节点上以3.3fps的速度被计算,然而,对于每一个像素需要投射22条阴影光线(4条用于直接光采样,18条用于间接光采样),每一帧需要产生500个散焦光子。
在图3 右图的场景中包含了两个通过5个直接光采样和20个间接光采样的光源。
大约每个光源产1,500个光子用于生成图中的两个焦散线。
图4 所示的"无形日期"场景包含9,000 的三角形。
它大部分是被指向天花板上那两盏灯间接照明的。
没有间接照明(见图 4 中的左图)这一幕将几乎完全黑暗,因为没有直接光照射到家具和反光地板。
在图4 右图的场景中展示了天花板下一个飞行的玻璃球把通过它的焦散线投射到了墙上。
这个场景很好的展示了由跟踪反射身光而形成的镜面反射效果和用新算法计算的间接光照效果相结合后的效果。
每光源使用兜了4次直接光和9 次间接光采样并产生500个焦散光子。
场景在8个渲染节点以2.6fps的速度渲染。
即使在交互期间,间接光阴影也是平滑和清楚的。
只能通过稍微好一点的焦散效果和由积累形成的抗锯齿效果来区分动态场景和融合的图像。
图5
在图5 中的办公室场景中包含34,000 的三角形。
全局光照是在拥有4次直接光采样和18次间接光采样的且产生1000个焦散光子的光源下计算的,在两个不同视点下都是以2.2fps的速度绘制。
虽然场景中的几何体相当简单,但场景中的光线是相当复杂的。
台灯是非常明亮且高度闭塞的,使有较大的方差估计值。
此外,图5中底部行中的复杂光照模式之所以也是可见的,是由于强光照射了书本,书本成了照亮这些复杂模型的二次面光源。
移动这本书会造屏幕闪烁,因为间接光照射到了这本书上,并且被反射了出去。
图6
图6 中会议室包含104个面光源照明,并由290,000个三角形组成。
由于几何体的复杂性,场景在12个渲染节点上只以1.2fps的速度渲染。
只是用5次直接光采样和20次间接光采样将导致严重的采样不足,然而,光线采样位置的合理分布和非连续缓存的过虑会使即使在交互期间也能绘制高质量的图像。
一旦交互停止,解决方案在2秒内就恢复到高质量。
5.1.模拟质量
该算法可以通过一个小型的直观参数集控制:直接和间接光采样数量、焦散光子数目和能自动确定相同尺寸下间隔采样模式的非续缓存的过滤器尺寸。
用户可以通过调整这些参数交互式地权衡图像质量的渲染速度。
然后,交互式系统对这些参数和场景本身的任何更改提供即时反馈为。
不出所料,在交互过程中使用低采样率会在阴影绑定时产生渲染失真。
尽管交互渲染质量满足不了生产质量,但它仍然很好的展示了全局光照明的效果并且可以1至2秒内获得高质量的图像。
非连续缓存会导致两种失真。
如果没有检测到连续性,在交互期间会产生欠采样失真(例如见图5 中椅子的轮廓和图 6 中的书架)。
这些失真在交互期间是不容易被发觉且随着渲染的推进会被迅速均衡掉。
另一方面,这种简单的启发式方法可以导致连续性检测错误。
这些失真都非常的模糊不清,因而不容易看。