直接光照和间接光照
我们现在的任务是要在上面直接光照和阴影的基础上加入的是间接光照,也就是需要加上其他的表面反射光线的照射对于我们当前计算顶点/像素的光照效果。我们可以和Path Raytrace所采用的方法一样,首先我们的渲染公式分为两个部分,直接照射和间接照射。
L =L1+L2
=L1+∫BRDF*L(x1)*cosθ*V*dω
这里L1表示直接光照,L2表示间接光照。L(x1)表示其他表面反射的光亮度。
和上面的介绍的两种情况一样,我们假设我们的顶点/像素所在的平面是理想的 Diffuse表面。我们接下来要解决得是我们公式中的间接光照部分。我们对于间接光照部分采用蒙特卡洛积分法来计算,于是可以得到
L =L1+∫BRDF*L(x1)*cosθ*dω
≈L1+(ρ1/PI)*(1/N)*∑(L(x1)*cosθ)/p(x1)
通过上面的表达式,我们可以得出我们计算间接光照部分的步骤是:首先我们以当前需要计算反射的顶点/像素为中心,在顶点/像素和所在表面的法线确定的半球内随机发射 N条光线和场景以及其他物体做碰撞检测。如果没有和场景或者其他物体都没有碰撞,那么这个方向不存在间接光照,也可以表示为L(x1)=0。反之就表示这个方向存在间接光照。然后我们就需要计算出这个交点朝该方向的反射光亮度。而对于这个交点来说朝这个方向的反射光亮度等于这个交点对于直接光照和间接光照的反射光亮度。我们在这里仅仅使用这个交点直接光照的反射光亮度来近似的代替交点朝这个方向的反射光亮度。这样的话我们就需要对于交点计算直接光照反射光亮度。我们使用上面提到的直接光照+阴影的方法来计算交点直接光照的反射光亮度。于是我们进一步得到
L ≈L1+(ρ1/PI)*(1/N)*∑(L(x1)*cosθ)/p(x1)
≈L1+(ρ1/PI)*(1/N)* ∑((∫BRDF*L(x1)*cosθ*dω)* cosθ)/p(x1)
≈L1+(ρ1/PI)*(1/N)* ∑∑((Li*T2i)* cosθ)/p(x1)
≈(ρ/PI)*∑Li*T1i+(ρ1/PI)*(1/N)* ∑∑((Li*T2i)* cosθ)/p(x1)
我们在当前计算顶点/像素和所在平面的法线所确定的半球随机采样,在这样的情况下p(x1)=1/(2*PI),带入上面最后的表达式得到
L ≈(ρ/PI)*∑Li*T1i+(ρ1/PI)*(1/N)*2*PI*∑∑((Li*T2i)* cosθ)
≈(ρ/PI)*∑Li*T1i+(ρ1/PI)*(1/N)*2*PI*∑(Li*∑(T2i* cosθ))
通过上面的推导,我们可以看出我们在计算直接光照和间接光照效果的时候,我们计算顶点/像素的T(x)的系数Ti,我们首先需要计算出顶点/像素在直接光照+阴影效果下的T(x)系数T1i。然后在顶点/像素和所在的平面的法线确定的半球内我们随机采样N条光线和场景以及物体作碰撞检测。对于每个交点,我们使用插值计算出该交点在直接光照效果下的T(x)系数。将我们得到所有的交点的系数乘上该光线和该交点所在的平面的法线的余铉值cosθ,然后求出平均值T2i。我们最终的直接光照和间接光照的T(x)系数了就等于我们上面计算出来的两组系数的和。Ti=T1i+T2i。
最终的渲染还是使用预计算的Spherical Harmonic Lighting和Radiance Transfer的系数之间的做点乘操作得到了最终需要计算的顶点/像素的反射光的亮度值。