剖析Unreal Engine超真实人类的渲染技术Part 1 - 概述和皮肤渲染 (5)

剖析Unreal Engine超真实人类的渲染技术Part 1 - 概述和皮肤渲染

上图描述了BRDF、BTDF、BSSRDF之间的关系:

BRDF:双向反射分布函数,用于表述在介质入射点的反射光照模型。

BTDF:双向透射分布函数,用于描述光线透过介质后的光照模型。

BSSRDF:双向次表面反射分布函数,用于描述入射光在介质内部的光照模型。

BSDF = BRDF + BTDF。

BSSRDF是BSDF的升级版。

下面两图展示了使用BRDF和BSSRDF的皮肤渲染结果:

剖析Unreal Engine超真实人类的渲染技术Part 1 - 概述和皮肤渲染

BRDF光照模型渲染的皮肤

剖析Unreal Engine超真实人类的渲染技术Part 1 - 概述和皮肤渲染

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表。

剖析Unreal Engine超真实人类的渲染技术Part 1 - 概述和皮肤渲染

上图展示了\(\rho=0.2\)\(r=0.5\)的索引表。

通过\(\rho\)\(r\)可查询到对应的\(S_r\),从而化繁为简,实现实时渲染的目标。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyfffj.html