学习笔记:pbrt中的光子映射I

光子映射是粒子追踪算法的一种,基本思想是用光子来表征从光源传递到渲染的点的能量,在这一过程中,传递的能量不通过光线的辐照度来体现,而是通过光子的数目和光子的作用范围来体现,可以说这种方法是从光的粒子性来考虑的。在介绍光子映射及其改进前,首先介绍粒子追踪算法。

粒子追踪算法是分析光线传播问题的一种直观方法,不过要利用该算法解决一些具体问题,就还需要对算法进行更深入的建模和分析。书中给出的建模方法是将场景中光照分布的采样用各处光子的历史累积数量和权重来表征。当每个光子从光源发出后,一旦与某表面相交后,就将由交点位置、入射方向和采样数据构成的光子信息存储到历史数据中。其中的采样数据将包含路径吞吐量函数和采样时的概率密度信息。实际上采样数据就对应光线传输方程中的入射辐照度乘以一个余弦值再除以概率密度部分。此外,各个光子还额外包含一个权重信息。权重信息是入射点和光线方向的函数。如果权重信息都取1,那么所有光子的采样均值就等于该处的光通量。产生这些光子的方式可以使用不同的策略,不过总体而言都是从光源出发经过若干次反射后到达某点。每次光子所经历的路径长度可以不同。使用这些光子的一个优势在于,每次它们的采样值不变,只是根据需要修改权重信息,这样就可以降低运算量。

下面介绍光子映射。首先考虑最简单的计算表面一点的出射辐照度的方程。方程中的入射辐照度是关于反射点和入射方向的函数,把它等效为在反射点周围一个表面上的若干delta分布的辐照度以各自的辐照度对反射点作用的和。此时,按粒子追踪的思路,权重可以取为delta函数和BSDF函数的乘积。由于权重中含有delta函数,因而采样得到的光子能对应到非零权重的概率为0。解决这一问题的方式也正是光子映射引入偏差的原因。解决该问题时,将delta函数转变为一个滤波函数,这个滤波函数效果是,某处的光子越多,它的权重越大,所产生的辐照度就越大。除了提高效率的优点外,还可以使用到某点附近的光子。当使用增量式的路径跟踪方法时,有些路径很难被采样到,但是通过利用某点附近的光子,就可以引入这些难被采样到的路径的作用。实现上述的滤波函数时,首先要选择一个核函数,该核函数在负无穷到正无穷范围内积分值为1,且在0处取值最大,在0两侧对称分布。当然该核函数可以仅在有限区间中取非0值,例如书中所采用的Epanechnikov核函数。使用核函数时,跟每个光子所在的位置进行平移,并按某宽度进行缩放。然后对所有光子处理后的核函数进行归一化处理。缩放所使用的宽度,通过采样该点处第N近的距离得到,并且为几维变量,距离就取几次方。

光子映射算法的使用包括两个阶段,第一个阶段是计算并存储从光源发射到表面得到的光子采样数据,一般采用kd树的形式来提高存储和读取的速度。第二个阶段是基于由相机发出光线到达的表面交点处附近的光子数据,计算要输出的辐照度值。对于这种算法,需要提前计算并存储场景中的全部光子,因而所能使用的光子数量将受限于存储空间。因而渲染图像的经度就受到限制,无法通过多花时间来提高渲染精度。

你可能感兴趣的:(学习笔记:pbrt中的光子映射I)