在实时全局光照的预处理阶段完成后,场景中的全部虚拟光源都已生成并存储,接下来就可以按实时全局光照的算法对场景进行渲染了。它总体的实现思路与直接光照模型相同,都是在仅考虑光源(这里包括虚拟光源)直接照射的结果的基础上,针对表面一个点的某一个出射方向,计算它的出射辐亮度。
实时全局光照算法在使用虚拟光源进行出射辐亮度的计算前,首先完成了两部分常规的辐亮度的计算。第一部分是该点的自发光,换言之该点本身为区域光源时所产生的出射辐亮度。第二部分是场景中光源(不包括虚拟光源)发出的光线在该点作用后产生的出射辐亮度。此处按直接光照模中型对全部光源进行采样的方式进行计算,此处不再展开。
完成前两部分的计算后,针对场景中的虚拟光源在该点作用产生的出射辐亮度进行计算。该计算利用了之前提到的光源集合的概念,即仅针对某一个光源集合中的全部虚拟光源进行计算,全部虚拟光源作用结果之和将作为最终输出。光源集合由随机方式进行确定。这是pbrt在实现实时全局光照时给出的方式,实际上书中也提到过针对光源集合还存在更为多样的利用方式,比如使用全部光源集合进行采样计算。
计算每个虚拟光源产生的作用效果时,其基本过程只需计算确定出射和入射光线方向后的bsdf值、光线传输方程中的几何项G以及光源的辐亮度的乘积再除以光源集合中的虚拟光源的数量,然后再乘以介质衰减特性对应的系数即可。个人理解,在常规的直接光照模型算法中,产生一个点的出射辐射度时,计算的是每根入射光线的辐亮度除以其采样概率的和。此处通过循环会计算每个虚拟光源对该点产生的光线的作用效果之和,因而也需要除以概率密度,而此时的概率密度就是光源数目的倒数。完成这一基本过程后,还需要针对虚拟光源的特殊性进行特殊处理。这里的特殊性主要是虚拟光源在场景中分布较广,会有较大概率出现一些光源和反射点距离很近的情况。由于在要计算的几何项G中,光源和反射点的距离的平方存在于分母上,因而就会出现一些几何项很大的情况,进而导致局部过亮的情况出现。该问题的解决方案是针对几何项进行限幅处理。后续再对限幅后产生的偏差进行补偿。第二项特殊处理是按俄罗斯轮盘赌的方式,按一定概率舍弃产生的辐亮度比较弱的光线,书中使用的概率是90%,即反射光线的辐亮度小于某确定阈值后按90%的概率舍弃该光线。完成上述两项特殊处理并验证反射光线不被遮挡后,将其辐亮度累加到最终输出中。另外,当虚拟光源在生成时所在路径加1小于一个最大镜面反射深度时,还计算该光线产生的镜面反射和投射效果。
下面具体介绍一下第一项特殊处理的原理和补偿方式。首先针对几何项G进行一种等价变换,变换后几何项可以表示为某两个数的最小值后另外两个数的最大值之和,前者的两个数分别为几何项和几何项的阈值,后者为几何项与几何项的阈值之差和0。在原计算式中仅考虑前者,即为补偿前的结果所对应的表达式。将后者代入原计算式中,将表达式中的关于面元的积分变量变为关于立体角的积分变量,并在分母中引入几何项G后,可以得到一个不会受光源和反射点距离近的影响的积分表达式。针对这个表达式进行采样,就可以计算相应的补偿项。在计算补偿项时,需要注意几点。第一,仅在虚拟光源在生成时所在路径长度小于一个最大镜面反射深度的值时,按上述方式补偿。第二,对于虚拟光源在生成时所在路径为1时,补偿量进行多次采样,超过1时,补偿量进行一次采样。