上图描述了BRDF、BTDF、BSSRDF之间的关系:
BRDF:双向反射分布函数,用于表述在介质入射点的反射光照模型。
BTDF:双向透射分布函数,用于描述光线透过介质后的光照模型。
BSSRDF:双向次表面反射分布函数,用于描述入射光在介质内部的光照模型。
BSDF = BRDF + BTDF。
BSSRDF是BSDF的升级版。
下面两图展示了使用BRDF和BSSRDF的皮肤渲染结果:
BRDF光照模型渲染的皮肤
BSSRDF光照模型渲染的皮肤
可见BSSRDF渲染的皮肤效果更真实,更美观,防止陷入恐怖谷效应。
回顾一下BRDF的方程,它是一次反射光照的计算是在光线交点的法线半球上的球面积分:
\[
L_o(p,\omega_o) = \int\limits_{\Omega} f_r(p,\omega_i,\omega_o) L_i(p,\omega_i) n \cdot \omega_i d\omega_i
\]
对于BSSRDF来说,每一次反射在物体表面上每一个位置都要做一次半球面积分,是一个嵌套积分:
\[
L_o(p_o,\omega_o) = \int\limits_{A} \int\limits_{\Omega} S(p_o,\omega_o,p_i,\omega_i) L_i(p_i,\omega_i) n \cdot \omega_i d\omega_i dA
\]
\(S(p_o,\omega_o,p_i,\omega_i)\)项表明了次表面散射的计算过程,具体公式:
\[
\begin{eqnarray}
S(p_o,\omega_o,p_i,\omega_i) &\stackrel {def}{=}& \frac{dL_r(p_o,\omega_o)}{d\Phi_r(p_i,\omega_i)} \\
&=& \frac{1}{\pi}F_t(p_o,\omega_o)R_d(\parallel p_i-p_o\parallel)F_t(p_i,\omega_i) \\
\end{eqnarray}
\]
其中:
\(\frac{dL_r(p_o,\omega_o)}{d\Phi_r(p_i,\omega_i)}\)表明BSSRDF的定义是出射光的辐射度和入射通量的比值。
\(F_t\)是菲涅尔透射效应。
\(R_d(\parallel p_i-p_o\parallel)\)是扩散反射(Diffuse reflectance),与入射点和出射点的距离相关。
\[
R_d(\parallel p_i-p_o\parallel) = -D\frac{(n\cdot \triangle\phi(p_o))}{d\Phi_i(p_i)}
\]
\(D\)是漫反射常量:
\[
D=\frac{1}{3\sigma_t'}
\]
由此可见,\(S\)项的计算过程比较复杂,对于实时渲染,是几乎不可能完成的。由此可采用近似法求解:
\[
S(p_o,\omega_o,p_i,\omega_i) \approx (1-F_r(\cos\theta_o))S_p(p_o,p_i)S_\omega(\omega_i)
\]
其中:
\(F_r(\cos\theta_o)\)是菲涅尔反射项。
\(S_p(p_o,p_i)\)是点\(p\)处的次表面散射函数。它可以进一步简化:
\[
S_p(p_o,p_i) \approx S_r(\parallel p_o - p_i\parallel)
\]
也就是说点\(p\)处的次表面系数只由入射点\(p_i\)和出射点\(p_o\)相关。
\(S_r\)跟介质的很多属性有关,可用公式表达及简化:
\[
\begin{eqnarray}
S_r(\eta,g,\rho,\sigma_t,r) &=& \sigma^2_t S_r(\eta,g,\rho,1,r_{optical}) \\
&\approx& \sigma^2_t S_r(\rho,r_{optical}) \\
r_{optical} &=& \rho_t r
\end{eqnarray}
\]
简化后的\(S_r\)只跟\(\rho\)和\(r\)有关,每种材料的\(\rho\)和\(r\)可组成一个BSSRDF表。
上图展示了\(\rho=0.2\)和\(r=0.5\)的索引表。
通过\(\rho\)和\(r\)可查询到对应的\(S_r\),从而化繁为简,实现实时渲染的目标。