学习笔记:pbrt中的实时全局光照I

光线追踪算法、路径追踪算法都属于全局光照算法。简单的讲,这些算法都是既考虑直接光照的作用效果,又考虑经过反射和透射所产生的间接光照的作用效果。这些算法都是计算量非常大的算法,难以在现有的硬件算力的基础上实时渲染。实时全局光照算法针对这一困难,在对全局光照算法进行一定的优化和近似后,努力是全局光照算法能够实时进行。它优化和近似的基本思路是在正式渲染之前,跟踪从场景中各光源发出的光线,在光线与物体的交点处建立包含入射辐亮度信息的虚拟光源,换言之就是对间接光照的作用效果进行预计算,并把间接光照的产生点视作虚拟光源,存储相关的辐亮度信息。在正式渲染时,不再使用路径追踪算法,而是采用直接光照模型,遍历场景中的所有光源和虚拟光源,计算着色点的出射辐亮度。个人理解,如果只是渲染单张图片,该方法与路径追踪算法的计算量总体相当,并不具备实时性。此处的实时性应该针对的是能够实时渲染动画,因为完成预处理后,正式渲染阶段该方法相对于路径跟踪算法的计算量大大降低。当然这里也存在一个问题,动画中必然存在变换的物体,这些物体就会使得光线传输的作用效果与预计算时的效果存在差异。

在pbrt中实现实时全局光照时定义了光源集合数量和光源跟踪路径数量。在预处理阶段,可以产生多个光源集合,每个集合中产生相同数量的光源跟踪路径,每个光源跟踪路径再产生若干个虚拟光源。正式渲染时,可以选择某个或某几个光源集合中的虚拟光源。单纯从选择光源集合数量的角度看,数量少时所形成的图像的噪声往往会比数量多时的噪声小。在具体生成每个光源集合中的光源跟踪路径时,没有对光源按集合进行划分,事实上生成的任何一条光源跟踪路径的方式都是相同的。在预处理阶段,可能会存在光线路径上相邻点距离过近,通过积分函数中与距离倒数平方有关的部分,即几何项部分,使虚拟光源亮度过大。对于这种情况,设定一个关于几何项的阈值,当超过阈值时,使用不同的采样方式,主要是采样数量不同。在预处理阶段,使用了近似俄罗斯轮盘赌的终止策略,并设定了终止时的光源辐亮度阈值,低于该阈值的光线则不再产生新的虚拟光源。另外,对于生成光源的过程中的镜面反射次数也设定了一个最大值,当超过该最大值后,该光线不再产生新的虚拟光源。上述两组与终止策略有关的变量,前者很好理解,对于后者书中没有给出解释。个人理解是镜面反射产生的光线的范围是非常小的,经历较多次镜面反射后,从全部场景看,该光线的作用范围将非常小,对全局的光照效果影响很小,因而就不再产生新的虚拟光源了。在初始化阶段,除了按双向路径追踪算法生成光源所需的采样需求外,还需要对选择哪个光源以及几何项超过前述阈值后的采样策略提供采样器。

你可能感兴趣的:(学习笔记:pbrt中的实时全局光照I)