学习笔记:pbrt中的辐照度缓存机制I

pbrt书中将该方法翻译为辐射度缓存机制,通过网上检索以及对英文源文件的查阅,确定将其译为辐照度缓存机制更为合适。该机制是提高光线追踪算法的运行效率的一种改进方式,它的核心思路时计算某渲染点的输出时,首先检索周围已渲染点的输出结果,如果满足某评判标准,就直接利用周围渲染点的输出结果进行处理得到该点的输出结果,反之则按常规的光线追踪算法计算该点的输出结果。无论那种方式得到的输出结果,都将结果放入缓存中,以备后续计算其他渲染点时使用。光线追踪算法能得到非常真实的渲染效果,但计算量巨大,采用辐照度缓存机制,就可以大大降低计算量。实际上这种方法也是自己刚接触光线追踪算法时就大致能想到的一种思路,只不过没有对该思路的细节进行进一步的思考,相信书中的这部分内容能够给出完备的实现细节。

在介绍该方法的具体实现前,先介绍一下它的适用场合和局限性。基于蒙特卡罗积分实现的光线追踪算法是一种无偏差解决方案。虽然该方案在采样数量不足够多时会使结果产生较大的方差,但是随着采样数量的增加,方差会逐渐减小,且计算结果最终会收敛的真实值。而利用辐照度缓存机制改进光线追踪算法则是一种有偏差的解决方案。利用渲染点周围点的输出来估算渲染点自身的输出实际上是采取了一种插值的处理方式,而且类似于一种低通滤波的方式,只估算输出中的低频分量,忽略输出中的高频分量。这种方式会得到噪声比较小,即方差比较小的图像,但估算的结果只是真实结果的一种近似,而且该近似不会随着采样数量的增加而逐渐收敛到真实值。由于这些局限性的存在,在采用该方法的渲染图像中可能会看到实际不应该存在的模糊斑点。不过虽然存在此种缺陷,它针对间接光照还是较为适用的,因为间接光照往往变化缓慢,占比更多的是低频分量,忽略占比较少的高频分量并不会给输出结果带来大的偏差。

辐照度缓存机制要解决两个问题:第一是辐照度的高效存储和读取;第二是直接计算辐照度和使用缓存计算辐照度两种方式的选择原则。为了解决这两个问题,首先要做好相应的准备工作。第一,确定缓存哪种形式的辐照度结果。由于计算某个渲染点的输出时,是对其周围点缓存结果进行插值而不关心周围点的内部作用过程,而且方法本身就是一种近似估算而非精确计算,因而存储的形式应该尽可能简单。根据这一思路,选择存储该点处的全部入射辐亮度光源关于立体角的积分以及入射辐亮度方向的平均值,而不存储入射辐亮度的概率分布。存储的第一项内容尤其适合于Lambertain表面,即漫反射表面的场合。第二,定义与使用缓存进行计算的条件有关的变量。具体的,定义了在相机坐标系中的最小像素间隔和最大像素间隔值,要求缓存中的点与要计算的着色点间的像素间隔需位于两者之间。第三,定义与缓存计算结果是否使用有关的变量。这部分在后面具体实现过程中进行说明。第四,按直接光照模型中的相关方法预设采样器。第五,定义与能并行计算的八叉树结构,用于按空间位置快速存储和查找各存储点的辐照度缓存结果。

你可能感兴趣的:(学习笔记:pbrt中的辐照度缓存机制I)