在利用辐照度缓存机制实现的光线追踪算法中,渲染点的输出计算和辐照度缓存更新是相互关联,交替进行的。下面首先介绍渲染点的输出计算部分。
计算某渲染点的输出需要计算四部分光线的作用。在计算这三部分光线作用前,根据由渲染点发出的光线对象及相交物体对象,计算交点处的坐标、法线和BSDF。接下来计算上述四部分内容。第一,根据光线方向计算交点处自发光的辐照度。第二,按照直接光照模型的算法,计算交点处直接由场景中全部光照产生的作用效果。第三,计算交点处由镜面反射或透射形式的间接光照所产生的作用效果。第四,计算漫散射形式的间接光照所产生的作用效果。辐照度缓存机制即在该部分发挥作用。该部分计算实际上也是分两部分进行,第一部分是漫反射和光泽反射形式的间接光照,第二部分是类似漫反射和光泽反射的透射形式的间接光照。在完成这两部分前,首先确保法线方向与出射光线方向在平面的一侧,其次估算了相邻像素间隔在世界坐标系中的距离。该结果将用于判断是直接计算还是利用缓存进行计算。实际计算该距离时,是通过对交点处微分几何体两个方向的分量构成的平行四边形的面积开平方得到。如果两个方向的分量相互垂直且长度相等,则得到的是正方形的边长。
下面在介绍计算漫散射形式的间接光照所产生的作用效果前,先介绍如何利用八叉树实现缓存中各点辐照度数据的快速查找和插值。在八叉树的数据结构中存储着已缓存辐照度数据的坐标点的包围盒信息。在利用八叉树进行快速查找前,需要提供待查找点的坐标和一个重载了括号操作符的对象。查找时,八叉树会判断查找点是否存在于某个包围盒中,凡是存在就会提供包围盒对应点采样信息包括的坐标,法线,辐照度和平均入射方向信息,并调用这个对象,执行相应的操作。这里所执行的操作主要就是判断该点是否用于后续计算。判断方式是定义两个偏差函数,一个是两点距离与预设最大距离之比,另一个是1减去两点法线余弦夹角的结果与预设最大结果之比的平方根。两个偏差函数取最大后作为最终的偏差。当该偏差小于1时,使用该点的辐照度数据,且辐照度和平均入射角度均进行加权,权重为1减去偏差,并且还单独对权重进行累加。完成八叉树中所有点的遍历后,返回累加的平均入射方向和加权平均处理后的辐照度。另外,返回这两个结果前,还需要累加的权重大于一个预设的权重最小值,否则查找失败,不返回这两个数据。
完成前述的查找和差值工作后,就可以计算漫散射形式的间接光照所产生的作用效果了。计算方法并不复杂,将平均入射方向作为入射方向后,该点的BSDF值乘以前面得到的辐照度值就得到了该点的输出。此时相当于把其他点的辐照度信息转换为一个有向光源。对于全漫反射表面,该方法与按入射光线概率分布计算得到的结果不存在偏差。对于有光泽的反射表面,按照书中的说法,该方法比按均匀入射得到的结果要好。
下面介绍辐照度缓存更新部分。这里需要说明的一点是,只有无法利用缓存计算,而直接计算的辐照度信息才会被存储到辐照度缓存中。计算辐照度需要对该点的入射辐亮度和入射方向的余弦的乘积关于立体角的积分。由于很难找到与该乘积形状相同的入射方向分布函数,所以使用蒙特卡罗积分时,入射光线采用余弦半球加权分布,且采样所需的二维随机变量采用低偏差序列生成。此外,产生的入射光线是在反射点的BSDF对应的局部坐标系中满足余弦半球加权分布,因而采样产生的光线还需要变换到世界坐标系中。光线生成后,采用路径积分器进行计算。每次计算结束后,将光线的辐亮度和方向进行累加。对产生的所有光线,还需要计算其长度的最小值。该最小值的一半按屏幕坐标系转换到世界坐标系的一个距离下限变量和距离上限变量取限幅后,作为该点的包围盒边长的一半。将该包围盒以及该点的辐亮度和平均入射光线方向信息加入到辐照度缓存中,就完成了更新过程。由八叉树的算法可知,该包围盒的范围也就决定了该缓存值能够使用的点的范围。