次表面散射(SubSurface Scattering)是指光线照射到物体后,进入物体内部,经过在物体内的散射从物体表面的其他顶点/像素离开物体的现象。在透明/半透明的材质上,这种效果比较明显,比如说是皮肤,玉等等。和BRDF的定义一样我们将存在次表面散射情况下的反射光亮度/照度定义为 BSSRDF。我们知道BRDF是BSSRDF的一种特殊情况,即所有的光线从一个顶点/像素进入物体内部也由该顶点/像素离开物体。从上面次表面散射的定义我们知道我们考虑该种情况下的反射不仅要考虑该顶点/像素对于入射光线的反射,还需要考虑表面其他的顶点/像素的对于该顶点/像素的散射光线。而BSSRDF是一个全局的考虑,它包含了BRDF的情况。
包含次表面散射的情况下,渲染公式是
Lo =∫∫BSSRDF*Li(xi,wi)*cosθi*dwi*dA(xi)
这里BSSRDF是xi,xo,wi,wo的函数。我们简化这个函数,使得它和wo无关,这样在投影阶段我们就可以使用Vector的系数来表示。也就是我们对于片面A上的每个顶点/像素计算对于顶点/像素xo的散射贡献度。我们首先使用蒙特卡罗积分法对于最外面的对于片面A的积分,我们在片面A上随即采样N,计算每次的散射值。p(xi)=1/S(A)。得到
Lo ≈(1/N)*∑(∫BSSRDF*Li(xi,wi)*cosθi*dwi)/p(xi)
≈(S(A)/N)*∑∫BSSRDF*Li(xi,wi)*cosθi*dwi
接下来我们将Li(xi,wi)和BSSRDF* cosθi预先投影到Spherical Harmonic,得到系数Tji和Lji。运行时我们只需要
Lo ≈(A/N)*∑∑Tji*Lji
这里我们需要注意的是对于我们的Precomputed Radiance Transfer计算我们需要简化上面的计算。我们可以假设在片面A上,各处的入射光一致,那么我们就可以使用该顶点/像素的Li来代替片面上其他顶点/像素的Lji.这样我们最终的计算就可以表示为:
Lo ≈(A/N)*∑(Li*∑Tji)
//
//PS:对于DX9中PRT处理SSS我始终找不到相关实现的方法资料。
//相关BSSRDF的计算可以参考
//“A Practical Model for Subsurface Light Transport”中的相关推导。
//