次表面反射函数主要是用来描述光线进入物体表面的一层半透明介质中经过一定的传输后再离开介质时的作用效果。其实它描述的过程不必局限于物体表面,对于任何半透明物体,都可以用它进行描述。因而换一种角度讲,该过程也类似于一种体散射过程,光线从介质区域某一点沿某一方向进入,然后从介质区域另一点沿某一方向射出。对于一些半透明介质而言,它内部的光线吸收率很低,在介质内部会发生很多散射行为,因而对这些散射行为,就需要形成较为高效的处理手段。
要高效的处理次表面反射函数,首先要考虑对BSSRDF的采样。BSSRDF的接口需要输入一个用于选择光谱通道的一维随机变量和用于采样的二维随机变量,输出包括对入射点、出射点、入射方向和出射方向的采样,以及采样的概率密度。
可分离的BSSRDF采样是对BSSRDF采样接口的一种简单实现,它把BSSRDF简化为出射方向的函数、入射点和出射点之间的距离、入射方向的函数等三部分的乘积。其中出射方向的函数直接按菲涅耳反射模型建模表示。入射方向的函数不显式给出,在对入射点和出射点之间的距离进行采样时,附带给出入射点的BxDF,并利用入射点的BxDF对入射方向进行采样,采样时所使用的也是菲涅耳反射模型。对入射点和出射点之间的距离进行采样的工作较为复杂,需要利用二维均匀分布随机变量实现采样。一种最直接的方法是使用测地线的方式对物体表面进行参数化建模,但该方法需要对各种形状物体进行单独考虑,不够实用。书中给出的一种实用化方法是在已知出射点和出射点法线方向的基础上,定义一个圆形平面,在该平面上按角度和半径两个维度进行采样得到某个点,该点沿法线反方向投影到表面的交点即为采样点。该方式得到的采样结果是径向对称的。这种方式还存在几个问题:第一,不同的光谱通道需要的圆形平面大小可能不相同;第二,得到的入射点法线和出射点法线接近垂直时,入射点选择会增大,此时如果对应的BSSRDF函数值较大,就会在最终结果中产生较大的噪声;第三,可能会存在多个投影点,每个投影点都对光线有作用效果。
对于第一个问题,解决方法是对不同的光谱通道采用不同的采样策略,且通道的选择是随机的。不同的采样策略核心是不同的圆形平面大小。圆形平面的大小将根据光谱通道和包含全部能量的99.9%的要求得到,具体实现会在下一篇笔记中展开。对于第二个问题,解决方法是将原来的每次采样展开成三次采样,这三次采样做投影时将针对三个不同的坐标轴展开,沿法线方向的坐标轴概率占比50%,剩下两个坐标轴各25%。由于关于入射点和出射点距离的函数的采样和概率密度在可分离BSSRDF中仍未具体实现,因而可分离BSSRDF仍为接口。针对第三个问题,首先要确定要将所有的投影点都记录在一个链表中。实现投影点的顺序性和不重复性,是通过每记录一个投影点,就将投影点更新为光线的起点来实现的。记录的投影点应该都属于同一个物体,而忽略其他物体上的投影点,这一点是通过材质编号的唯一性实现的。从记录的投影点中随机选取一个作为采样输出,并且还要计算该采样的概率密度。最终输出的概率密度要在单个采样的概率密度的基础上除以投影点数得到。下面介绍单个采样的概率密度计算方法。该概率密度为关于三个坐标轴和n次采样的双重循环中每一次的概率密度之和。每一次的概率密度由四部分的乘积组成:1)n次采样的倒数;2)使用三个坐标轴之一的概率;3)入射点和出射点的距离为该次对应距离的概率密度;4)光线方向与法线夹角的余弦值。实际上,对应不同的光谱通道和选择的不同坐标轴,得到的投影点的数目是不一定相同的。准确的概率密度应该计数每次采样的投影点数目后再进行加权计算。未采样准确计算方式是为了提高运行效率。