前续:Q132:PBRT-V3,BSSRDF(双向散射表面反射分布函数)(5.6.2章节、11.4章节)
从Q132中,咱知道了在给定(po, wo, pi, wi)的情况下怎么求解S(po, wo, pi, wi)。
这一章节,要做的事情主要是:
在只知道(po, wo)的情况,怎么对BSSRDF进行采样,然后得到(pi, wi)、其对应的概率pdf、S(po, wo, pi, wi)的值。
采样的思路是:对式子右端的各个因子分别进行单独采样。
第一个因子:
不用管这个因子。
原因是:咱们这里考虑的是次表面的散射情况,既然已经进入了次表面,说明在此之前的表面的BSDF已经处理过反射和折射了。进入次表面的光已经是经过折射之后的光了。或者说,这个因子已经在此前的bsdf->f()中,已经累乘到beta中了。
第二因子:
对这个因子的采样最终要得到“交点”pi的值、对应的概率、Sp的值。
这个计算起来最为复杂,后面重点讲这个。
第三个因子:
在完成第二个因子的采样后,得到一个“交点”pi。
对Sw的采样是这样:将Sw看做一个类似diffuse的BSDF加到pi->bsdf中。
什么叫做“类似diffuse的BSDF”呢?
其一:入射光的方向wi均匀的来自各个方向;
其二:入射光的强度根据Sw()来计算;
对这个因子的采样最终要得到“交点”pi的值、对应的概率、Sp的值。
从Q132中,咱知道了:求Sr的值,其实就是根据r去查一个BSSRDTable对象中的一个叫做“profile”的表。
所以,现在要对“式子[15.14.2]”进行采样,其实也就是对“r”进行采样,然后根据r到“profile”表中去找一个Sr的值。当然,这个“r”和pi是对应的。
简而言之:将“profile”中中Sr的值映射到几何体上Po点附近的区域上。每个Pi点对应一个映射点,对应一个概率,对应一个Sr值。
我们要做的是:
1,找Pi
2,求Pi对应的概率;
3,求Pi对应的Sr(这个参照Q132,直接查表);
1.1.1,过Po做曲面在该点的切平面(no为Po处的法向量)。并在Po点建立局部坐标系。
1.1.2,以Po为球心,r_max(Sr表中一个很大的r)为半径做一个球面。(所有可能的Pi都应该在这个球面以内)。在局部坐标系中,先对球面的极坐标phi进行采样(所以,图15.8中显示的是是个圆)。
1.1.3,对球面的极坐标r进行采样(图15.8中标记的r即为采样点)。
做一条距离数轴长度为r平行于该数轴(图15.8中选的数轴为no)的直线,该直线和圆相较于P_base、P_target两点(如图15.8所示)。设这两点之间的距离为l(如图15.10所示)。
1.1.4,P_base和P_target所在的直线和Po所在的几何体可能有多个交点。(如图15.11所示)
1.1.5,从“步骤1.1.4”中所求的交点中随机选取一个交点,作为Pi。
相关代码截图如下:
因为:
“Sp(po, pi)”的采样中已经确定了Pi。
接下来,要采样的是wi。
对Sw的采样是这样:将Sw看做一个类似diffuse的BSDF加到pi->bsdf中。
下方是PathIntegrator::Li()函数中部分代码的截图: