最近在做一个数字人渲染DEMO,本博客将用于记录搜集到的 Skin Rendering 技术,持续更新中。
现实皮肤模型
在渲染皮肤时主要关注以下光照路径:
-
镜面反射:6%入射皮肤的光被皮肤最上层油脂菲涅尔反射
- 实现例子:Dual Specular BRDF
-
次表面散射(Subsurface Scattering,SSS):94% 的光进入皮肤次表层,在围绕进入点的 3D 邻域中返回和离开表面。现实的皮肤介质是多层的,而较物理的渲染一般建模成至少两个不同的层。散射路径还可进一步细分为单次散射和多次散射的路径:
- 单散射:在介质内部只散射了一次的光照贡献,与光线角度相关性大
- 多散射:在介质内部散射了2次或更多次的光照贡献(也是diffuse现象的主要来源,而皮肤主要贡献便是多散射)
- 实现例子:BSSRDF
-
透射 [可选]:对于较薄的物体(如耳朵边缘、鼻子边缘),光射入的平面和射出的平面很可能是不一样的。实际上如果次表面散射的路径实现的足够物理,自然而然也会包含透射现象,因此该光路是可选的
- 实现例子:BTDF with Thickness Map & Shadow Thickness
BSSRDF 渲染模型 [2001]
光线进入 shading point 周围的像素后经过在散射介质内部的随机游走(Random Walk),可能会从 shading point 射出。
但 SSS 的光线在散射介质中的游走行为难以模拟,为了达成实时渲染的性能要求,便有了以下思路:
- 提供一个类似于 BRDF 的函数(也就是 BSSRDF),但输入参数从4D(入射方向、出射方向)变成了8D(入射点位置、入射方向、出射点位置、出射方向)
- 太远的像素对 shading point 的散射光贡献极小,因此可以忽略它们,只对一定范围内的表面 A 进行积分
图左是 BRDF 的行为,图右是 BSSRDF 的行为
于是便有了基于 BSSRDF 的渲染方程,相当于在 BRDF 渲染方程的基础上增加了对表面的积分:
\(L_{o}\left(p_{o}, \omega_{o}\right)=\int_{A} \int_{2\pi} S\left(p_{o}, \omega_{o}, p_{i}, \omega_{i}\right) L_{i}\left(p_{i}, \omega_{i}\right)\left|\cos \theta_{i}\right| d \omega_{i} d A\)
然后又基于下列假设:
- 次表面散射的物体是一个曲率为零的平面
- 这个平面的厚度,大小都是无限
- 平面内部的介质参数是均匀的
- 光线永远是从垂直的方向入射表面
得出 BSSRDF 函数的形式:
\(S\left(p_{o}, \omega_{o}, p_{i}, \omega_{i}\right)=\frac{1}{\pi} F_{t}\left(\eta_{o}, \omega_{o}\right) R_{d}\left(\left\|p_{i}-p_{o}\right\|\right) F_{t}\left(\eta_{i}, \omega_{i}\right)\)
Diffusion Profile(扩散剖面)[2001]
Diffusion Profile 描述了光线如何在半透明物体中进行扩散和分布,其函数形式如下:
\(R_{d}\left(\left\|p_{i}-p_{o}\right\|\right)\)
其实就是一个记录了 BSSRDF 答案的二维 LUT ,输入参数是单散射的albedo和距离。
实际上 Diffusion Profile 就是预计算散射光线在介质内部的 Random Walk 行为,然后做成 LUT 以供 BSSRDF 快速查询结果,从而达成实时渲染的性能需求。
此外,可以看到这个距离模型其实是忽略形状的,只是简单的输入两点间距离,虽然简单,但是实际效果还是相当能接受的。
常见有计算 Diffusion Profile 的方法:
- 偶极子(Dipole)[2002]
- 多级子(Multipole)[2005]
- 高斯和(Sum-of-Gaussians)拟合 [2007]
- Burley Normalized Diffusion 拟合 [2015]
偶极子、多极子方法是早期用来计算 Diffusion Profile 的离线模拟方法,而高斯和、Bueley Normalized Duffsion 则是已有精确 Diffusion Profile 情况下用来拟合的方法;因此在实时渲染的时候,往往采用拟合方法而不用使用占据大量空间的精确 Diffusion Profile 数据。
偶极子 [2002] & 多极子 [2005]
偶极子、多极子方法实在太老,而且极子部分涉及的物理知识完全没学过,没什么参考价值还是跳过把。
将 BSSRDF 分成单散射部分和漫反射部分去计算:
\(S = S_{ss}+S_{ms}\)
单散射近似:为了简化折射路径,假设光源离表面距离很远,将使用直射的ray来近似折射,因此可用 BRDF 来近似,结合蒙特卡洛方法计算出来。单散射的 radiance,受折射路径距离、折射吸收率扩散率影响:
\(L_{o}^{(1)}\left(x_{o}, \vec{\omega}_{o}\right)=\frac{\sigma_{s}\left(x_{o}\right) F p\left(\vec{\omega}_{i} \cdot \vec{\omega}_{o}\right)}{\sigma_{t c}} e^{-s_{i}^{\prime} \sigma_{t}\left(x_{i}\right)} e^{-s_{o}^{\prime} \sigma_{t}\left(x_{o}\right)} L_{i}\left(x_{i}, \vec{\omega}_{i}\right)\)
虽然BRDF是基于直射路径的,但是关于折射路径的距离仍然可以通过以下斯涅耳定律公式估计出:
\(s_{i}^{\prime}=s_{i} \frac{\left|\vec{\omega}_{i} \cdot \vec{n}_{i}\right|}{\sqrt{1-\left(\frac{1}{\eta}\right)^{2}\left(1-\left|\vec{\omega}_{i} \cdot \vec{n}\left(x_{i}\right)\right|^{2}\right)}}\)
漫反射近似:假设两次及以上的散射事件导致了光分布的均匀,因此这部分散射视为漫反射。使用偶极子来表示入射光源分布,上面为正的真实光源,下面为负的虚拟光源。
仍然采用蒙特卡洛方法,取N个sample分布于不同的半径 \(z_r\)(与负光源的距离),然后推算出一系列变量(如\(Z_v\)),其中 1 个sample 受偶极子源影响的漫反射:
\(\begin{aligned} R_{d}(r) &=\frac{\alpha^{\prime}}{4 \pi}\left[\left(\sigma_{t r} d_{r}+1\right) \frac{e^{-\sigma_{t r} d_{r}}}{\sigma_{t}^{\prime} d_{r}^{3}}+z_{v}\left(\sigma_{t r} d_{v}+1\right) \frac{e^{-\sigma_{t r} d_{v}}}{\sigma_{t}^{\prime} d_{v}^{3}}\right] \end{aligned}\)
多极子:偶极子模型可以满足许多材料的散射效果。然而,对于由多层组成的材料,每一层都有不同的散射特性,轮廓的形状变得比偶极子所能表示的更复杂。使用更复杂的多极模型可以显着改善皮肤等多层材料的视觉外观。偶极子的简单形状源自单个无限厚层中的散射,导致蜡质外观。偶极子不能捕获广泛散射的真皮层顶部的薄的、窄散射的表皮层的组合反射率。
图a为偶极子效果,图b为多层多级子效果
高斯和 [2007]
对于扩散分布 \(R(r)\),用 k 个具有不同权重且不同方差的高斯分布去拟合,即:
\(R(r) \approx \sum_{i=1}^{k} w_{i} G\left(v_{i}, r\right)\)
- 1个高斯函数可以很好拟合多散射效果,但无法拟合单散射+多散射
- 2个高斯函数可以勉强拟合单散射+多散射
- 6个高斯函数可以得到相当高精度的拟合效果
对于三层皮肤建模,一个拟合效果相当好的6层高斯和的参数如下:
该6层高斯和对应的函数图:
Burley Normalized Diffusion [2015]
放弃物理,直接用纯数学(一个数学公式)的方法拟合 Diffusion Profile:
\(R_{d}(r)=\frac{e^{-r / d}+e^{-r / 3 d}}{8 \pi d r}\)
-
开销低,精确度却相当逼近基于蒙特卡洛暴力积分的无偏解
-
CDF 有解析解,可进行重要性采样优化
-
和高斯和拟合相比,Normalized Diffusion 不能使用分离核方法,也就是说它必须得老老实实进行2D卷积Pass,因此性能要求更高
可以看到这个拟合效果比起偶极子好上很多
基于模糊的 SSS 方法
纹理空间模糊(Texture Space Blur) [2003]
总体流程:
-
渲染任何阴影贴图
-
渲染拉伸校正贴图(可以是预先计算的)
-
渲染辐照度纹理
-
纹理模糊:
- 卷积核的权重:由高斯和拟合的 Diffusion Profile 确定
- 卷积核的半径:由拉伸矫正贴图提供半径拉伸系数
- 对每个高斯核进行可分离的模糊 Pass,并保存对应高斯卷积纹理
-
在 3D 中渲染网格:
- 访问每个高斯卷积纹理并线性组合
- 为每个光源添加镜面反射
屏幕空间模糊(Screen Space Blur) [2009]
核心思路:
- 只需要对屏幕中 Stencil 标记过的 Skin像素进行若干卷积操作,极大地降低了 Blur 的像素数目
- 卷积核的大小:根据当前像素的深度 z(x,y) 及其深度两个方向的导数来确定
Pre-Integrated Skin(预积分的皮肤着色)[2010]
Pre-Integrated Skin 是一个远远脱离物理基础的算法,其特点主要是高效、简单、视觉可接受
核心思路:
- 预先对纹理进行卷积,而不用运行时卷积。
- 查找表的参数分别是dot(N,L)和曲率,这两者结合就可以反映出光照随着曲率的变化。
Separable SSS(可分离的次表面散射)[2015]
BSSRDF 实质就是进行一次2D卷积运算,可分离的卷积核就是在寻找一个可分离的核来表示的 Diffusion Profile 的近似,然后转成两个1D 卷积 Pass ,让时间复杂度从O(n^2)=>O(n)
如图,先经过一次 X 方向的卷积 Pass ,再经过一次 Y 方向的卷积 Pass 就能得到相当于 2D 卷积的效果,最后再添加 Specular 就能得到很好的 SSS 材质效果。
注:不可以先添加 Specular 再进行卷积,不然会出现明显的 aritifact (例如高光处被卷积成十字形状)
- 高斯和函数的卷积核:传统拟合方法;1个2D高斯虽然可分离,6个2D高斯和却是不可分离的,除非使用6*2个1D卷积 Pass ,或者老老实实 2D 卷积,但都比较耗性能
- 基于SVD分解的可分一维卷积核:有局限
- 艺术家易用的卷积核:分解为近距离散射和远距离散射两个部分,两个高斯函数先相加后相乘,相当于四个高斯函数单独作用再相加
\(a_{m}(x)=w G\left(x, \sigma_{n}\right)+(1-w) G\left(x, \sigma_{f}\right)\)
\(A_{m}(x, y)=a_{m}(x) a_{m}(y)\)
- 增加引导函数的可分一维卷积核:给每个位置增加了一个重要性系数,用户可自定义,但没有直接的物理意义
- 预积分可分离核(Pre-integrated Separable Kernel):paper主要推荐的卷积核。
前提是假设 \(E\) 可分离:
\(E(x, y)=E_{1}(x)+E_{2}(y)\)
或者换个形式表示就是 \(\frac{\partial E}{\partial x \partial y}=\frac{\partial E}{\partial y \partial x}=0\)
一个常见的满足E可分离的例子便是曲率为0的平面,换句话说,如果一个点的周围都是平的且不考虑外部的阴影遮蔽关系,那么该点邻域内各个位置的 E 都是一样的。
然后根据下列公式推导,2D核 \(R_d\) 就可被分离成两个1D核 \(a_p\) :
\(\begin{aligned} M_{e}(x, y)=& \iint E\left(x^{\prime}, y^{\prime}\right) R_{d}\left(x-x^{\prime}, y-y^{\prime}\right) d x^{\prime} d y^{\prime} \\=& \int E_{1}\left(x^{\prime}\right) \underbrace{\int R_{d}\left(x-x^{\prime}, y-y^{\prime}\right) d y^{\prime} d x^{\prime}}_{a_{p}\left(x-x^{\prime}\right)} \\ &+\int E_{2}\left(y^{\prime}\right) \underbrace{\int R_{d}\left(x-x^{\prime}, y-y^{\prime}\right) d x^{\prime}}_{a_{p}\left(y-y^{\prime}\right)} d y^{\prime} \\=& \iint E\left(x^{\prime}, y^{\prime}\right) \frac{1}{\left\|a_{p}\right\|_{1}} a_{p}\left(x-x^{\prime}\right) a_{p}\left(y-y^{\prime}\right) d x^{\prime} d y^{\prime} \end{aligned}\)
其中,\(\left\|a_{p}\right\|_{1}=\left\|R_{d}\right\|_{1} \quad\|x\|_{1} =\sum_{i}\left|x_{i}\right|\)
这样可以把2D卷积写为2个1D卷积:
\(\left(E * R_{d}\right)(x, y) \approx(E * A)(x, y)=\sum_{i=1}^{N}\left(\left(E * a_{i}\right) * a_{i}\right)(x, y)\)
其中,\(A(x, y)=\sum_{i=1}^{N} a_{i}(x) a_{i}(y)\)
具体实现 :
- 需提前有一份较精确的 diffusion profile(如6个高斯和拟合成的 \(R_d\) 函数),然后对 \(R_d\) 进行预先卷积(对距离的积分)得到 \(a_p(offset)\) 函数,换句话说就是一张一维表(输入一个 \(offset\) 值,输出一个 \(a_p\) 值)
- 在具体实现中,则使用 N 个 sample 来取代这张一维表,规定好每个sample 的 offset 值 和计算出对应的 \(a_p\) 输出值
- 将这个 sample list 传给 shader,让 shader 根据这些配置好的 sample 进行两次 1D 卷积 Pass
注:即使E实际不可分,作者认为预计分可分离核的使用效果仍然足以接受,因此目前仍广泛适用于各类实时BSSRDF皮肤渲染上
额外处理工作:
-
抖动 Jittering:paper 使用的一个可分核的扩散近似,在入射辐射度发生高频变化的地方会产生人工痕迹。这是因为信号的空间占用(尺寸)比核的宽度更小,从而产生不对称的星形图案。因为本文使用的近似核不是完全经向对称的
- 对1D过滤器作用一个随机旋转(逐个像素)
- 这种方式不需要对进行重新预积分,因为核的宽度并没有变化
- 为了减少计算负荷,作者只对靠近像素的采样进行处理(10%),增加区域可以取得更好的效果,看下图区别:
- 核的宽度:卷积核的尺寸受一个于深度相关的拉伸因子
\(s_{x}=\frac{a}{d(x, y)+\beta \cdot a b s\left(V_{x} d(x, y)\right)}\)
\(s_{y}=\frac{a}{d(x, y)+\beta \cdot a b s\left(V_{y} d(x, y)\right)}\)
-
重要性采样:
- 为了计算1D函数的卷积,需要对这个函数进行采样(离散化)
- 为了计算效率,三个颜色通道使用一样的重要性采样,这个重要性采样由主导通道决定
Bilateral Filtering [2010]
绝大部分 BSSRDF 模型有一个很大的缺陷就是假设表面是平面,并且在平面上进行采样。这显然错误,现在通过 Bilateral Filtering 技术,可以把深度信息考虑进去做采样。
\(I \approx \frac{2 \pi}{n} \sum_{i=1}^{n} \frac{R\left(r_{i}, d_{i}\right)}{p\left(r_{i}, d_{i}\right)} L=\frac{2 \pi}{n} \sum_{i=1}^{n} \frac{R(\sqrt{r_{i}^{2}+d_{i}^{2}})}{p\left(r_{i}, d_{i}\right)} L\)
接下来就碰到困难了,\(p(r_i,d_i)\) 怎么算,之前的pdf是按平面计算的,它们的对应关系很难求。Unity 在报告中采用强制能量守恒,添加一个归一化常数。
\(I=\frac{\sum_{i=1}^{n} \frac{R\left(\sqrt{r_{i}^{2}+d_{l}^{2}}\right)}{p\left(r_{i}, d_{i}\right)} L}{\sum_{i=1}^{n} \frac{R\left(\sqrt{\left.r_{i}^{2}+d_{l}^{2}\right)}\right.}{p\left(r_{i}, d_{i}\right)}}\)
Participating Media 渲染模型
Participating Media 是描述次表面散射最精确的模型,它描述了光线传播时因散射、吸收而导致的变化率方程:
\(\frac{\partial}{\partial t} L_{o}(p, \omega)=-\sigma_{t}(p, \omega) L_{i}(p,-\omega)+\sigma_{s}(p, \omega) \int_{\delta^{2}} phase \left(p,-\omega^{\prime}, \omega\right) L_{i}\left(p, \omega^{\prime}\right) d \omega^{\prime}\)
\(\sigma_a\) = absorption 系数,\(\sigma_s\) = in/out-scattering 系数,\(\sigma_t=\sigma_a+\sigma_s\) = extinction 系数
散射介质内部的 albedo 定义为:
\(\rho=\frac{\sigma_{s}}{\sigma_{s}+\sigma_{a}}=\frac{\sigma_{s}}{\sigma_{t}}\)
使用这个渲染模型就意味着要模拟光线在物体内部空间的随机游走(Random Walk),相比于只求了表面积分的 BSSRDF 渲染方程,它更加精确但也是计算量最大的方法,基于该方法的基本都是离线的体积渲染方法:
- Volumetric Path Tracing
- Volumetric Photon Mapping
- 等等
图左是 BSSRDF 渲染模型做的,图右是Participating Media 渲染模型做的
Phase 函数
phase 函数表示了每对传入传出方向的能量分配概率。
各向同性 Phase
相当多的次表面散射的扩散模型假设各向同性,不捕获各向异性散射。这样简化的各向同性 phase 函数:
\(p=\frac{1}{4\pi}\)
各向异性 Phase
常用的各向 phase 函数便是 Henyey-Greenstein (HG) 函数,其中 n 为散射次数:
\(p_{n}\left(\omega \rightarrow \omega^{\prime}\right)=\frac{1-g^{2 n}}{4 \pi\left(1+g^{2 n}-2 g\left|g^{n-1}\right|\left(-\omega \cdot \omega^{\prime}\right)\right)^{3 / 2}}\)
皮肤的真实测量显示了各向异性值为 g = 0.8,随着n的增长,越来越呈现各向同性。
Schlick Phase 近似
获得与 HG Phase 函数相似结果的一种更快的方法是使用 Blasi 等人提出的近似方法,通常为第三位作者命名为 Schlick Phase 函数:
\(p(\theta, k)=\frac{1-k^{2}}{4 \pi(1+k \cos \theta)^{2}}\)
其中, \(k \approx 1.55 g-0.55 g^{3}\)
它不包括任何复杂的幂函数,而只是一个平方,这是更快的计算。 为了将该函数映射到原始HG相函数,需要从g中计算k参数。对于具有恒定g值的参与介质,只需执行一次。 在实际应用中,Schlick相位函数是一个很好的能量守恒近似。
Random Walk SSS(Volumetric Path Tracing)
Diffusion-based 近似现在仍然广泛使用,在假设介质是半无限长的平板(semi-infinte slab)的情况下,可以有很好的效果。而 MC 方法才能表现出物理正确,尤其在皮肤边缘处(例如鼻子边缘、耳朵边缘)更加符合现实。
图左是 normalized diffusion,图右是 path-traced SSS
Path Sampling 的一些方法 [2016、2017]
- Practical and Controllable Subsurface Scattering for Production Path Tracing [2016] [Disney]
- Path Traced Subsurface Scattering using Anisotropic Phase Functions and Non-Exponential Free Flights [2017] [Pixar Animation Studios]
距离采样
-
固定步长,无重要性
-
根据单一波长的消散系数,适用于单色介质:\(p(s)=\sigma_{t} e^{-\sigma_{t} s}\)
-
根据RGB三种波长的 transmittance (spectral MIS):
-
[2016] 累计吞吐量(throughput),权重取决于单散射 albedo。当某个波长吞吐量到达0时,就不需要做更多的采样了
-
[2017] 使用基于 RGB 三种波长的 MIS:
\(P(s)=P(\lambda) * P_{\lambda}(s)\)
\(P_{\lambda}(s)=\sigma_{\lambda} e^{\left(-s \sigma_{\lambda}\right)}\)
MIS 权重将使用平衡启发式:\(W_{\lambda}(s)=P(\lambda) /\left(P\left(\lambda_{R}\right)+P\left(\lambda_{G}\right)+P\left(\lambda_{B}\right)\right)\)
剩下的问题就是选取哪个 \(P(λ)\) ,也就是选择R、G、B哪个通道的波长来做距离采样:使用当前吞吐量(throughput)来指导选取某个 \(P(λ)\) 的概率,所谓吞吐量其实就是通道的贡献度,贡献度越高的通道更容易被选取
-
RGB三种波长的消散系数往往是不同的(transimittance是不同的),例如皮肤介质中的红光比其他波长传播得更远
方向性采样
- 假设各向同性时,无重要性
- 假设各向异性时,根据 Phase 函数分布做重要性采样(皮肤介质的 g 参数大约是0.8)
Dwivedi Sampling
- 根据介质厚度“bias”一下采样来增加 random walk 返回到入射平面或者从另一个出射平面射出的机会,从而加速收敛
- 需要先通过一个探测射线来估计物体厚度,而且需要将该物体假设为曲率为0的平板物体
将这些采样方法通过 MIS 组合起来使用。最后Pixar的论文实现中的 MIS 共使用了6个采样方法(for RGB renders)
对艺术家调参友好
-
[2016] 近似公式映射单散射 albedo \(\alpha\) 、表面 diffuse color、多重散射 albedo \(A\) ,减少控制参数数量:
\(\begin{aligned} \alpha &=1-e^{-5.09406 A+2.61188 A^{2}-4.31805 A^{3}} \\ s &=1.9-A+3.5 *(A-0.8)^{2} \\ \sigma_{t} &=1 /(d * s) \end{aligned}\)
\(d\) 是散射距离。
- [2017] Numerical Albedo Inversion:支持 diffuse color 来反向计算出 单散射 albedo,对艺术家调参友好 ;主要通过多项式来拟合
先算出输入单散射 albedo 到输出 diffuse color 的映射表(40 albedo \(\alpha\) * 40 各向异性系数 \(g\) = 1600 组合的 diffuse color)
- \(A、C、D、F\) 将使用含 \(g\) 的多项式拟合:\(A(g)=a_{0}+a_{1} g+a_{2} g^{2}+a_{3} g^{3}+a_{4} g^{4}+a_{5} g^{5}+a_{6} g^{6}+a_{7} g^{7}\)
- \(B、E\) 将使用含 \(g\) 的指数多项式拟合:\(B(g)=a_{0}+a_{1} \exp \left(a_{2} g+a_{3} g^{2}+a_{4} g^{3}+a_{5} g^{4}+a_{6} g^{5}+a_{7} g^{6}+a_{8} g^{7}\right)\)
只要记好了各种 \(a_i\) 系数,之后渲染就可以通过输入表面颜色 \(x\) 和各向异性系数 \(g\) 来得到单散射 albedo
\(\alpha(x, g)=\left(1-x^{0.25}\right) \cdot A(g) \tan ^{-1}(B(g) x)^{C(g)}+x^{0.25} \cdot D(g) \tan ^{-1}(E(g) x)^{F(g)}\)
- [2017] Non-Exponential Free Flight:将传统物理的 Transmittance 公式(即散射传播距离与剩余光子率的关系)改成非指数的公式,参数更好控制,对艺术家友好
Manifold Next Event Estimation,MNEE [2015]
- Manifold Next Event Estimation [2015]
核心思路:已知摄像机到散射介质内表面的折射路径 \(x_a,x_1,x_b\),然后在面光源上采样一个点 \(x_c\),连接 \(x_b、x_c\) 为种子路径 \(Y\),然后根据采样半程向量 \(h\) 的结果,来不断迭代让路径 \(Y\) 折成可以满足折射规律的可接受的路径 \(X\)
Subdivision Next-Event Estimation,SNEE [2016]
- Subdivision Next-Event Estimation for Path-Traced Subsurface Scattering [2016]
传统的游走路径最终的 BTDF 可能很难打在光源上(图左),而SNEE的主要想法是通过一条额外的子路径来满足折射规律的情况下还能直接打到光源上。
采样边界顶点 \(x_k\),两个采样子路径:
- 一个从光源出发的自顶向下路径(NEE)
- 一个根据 Phase 函数分布的自底向上路径(正常的 Phase 函数分布采样)
不同散射介质适用不同的nee技术:
- 高密度介质,如皮肤, 仅需要在最后一个点做NEE
- 对于低一些密度的介质,例如水或者液体,需要在内部每个游走点(单散射的)做NEE,并且使用 transparent shadows 来通过几何
- 对于散射介质含内部表面,如眼球,可以使用MNEE产生焦散,随着在介质的透射距离而减弱
工业界实现方案
UE4 方案 [Metahuman]
Skin Pipeline
- 几何处理 Pass:根据各种贴图及某些混合计算方式来算出每个像素点的 BaseColor、Specular、Roughness、Normal 等属性(G-Buffer)
- Lighting Pass:根据光源到表面的 diffuse transmission 和表面的 BaseColor 等属性计算出该像素点的 diffuse radiance
- SSS Pass:使用 Separable SSS/Burley SSS/Both 实现基于屏幕空间的模糊
- 其它 Pass:
- 增加高光效果,即 Dual Specular
- 改进的 SSAO
- 其他后处理效果
SSS材质 几何处理Pass
皮肤毛孔及其它皮肤表面细节提供了皮肤的各向异性视觉效果,对于不同的地方应该有不同的specular、roughness等参数,一般是混合额外的细节贴图,这样就可以增加镜头很近时的皮肤细节
- Base Color
- Specular:微观高光度贴图,与全局specular混合
- Roughness:微观粗糙度贴图,与全局roughness混合,此外还通过Fresnel节点加强了角色视角边缘的粗糙度
- Normal:微观法线贴图,主法线与微观法线按一定比例混合规范化
接近物理真实的渲染:\(cavity \cdot Specular(gloss) \cdot Fresnel(reflectance)\)
近似渲染: \(Specular(gloss) \cdot Fresnel(cavity \cdot reflectance)\)
cavity 是凹陷度,可从 cavity map(下图)中采样获得;Specular(gloss) 表明高光项;Fresnel(reflectance) 是与视觉角度相关的反射
SSS材质 SSS Pass
Separable SSS:
- 通过6个高斯和预计算profile,再用预积分的可分离核去近似拟合profile,运行时便是2个pass
- 后处理:基于屏幕的模糊,且仅用两个pass(横向、纵向)去实现模糊,时间复杂度 O(n^2)=>O(2*n)
- 性能更优,但精确度不够
Burley Normalized SSS:
- 基于 Burley Normalize Diffusion
- 后处理:基于屏幕的模糊,使用2D卷积
- 精确度更好,但性能开销更大
Both:
- 尚未看完源码,还不清楚怎么将这两种技术结合的
添加皮肤反射
-
直接反射:采用 双镜叶高光(Dual Lobe Specular),即两个 Cook-Torrance 的 BRDF Lobe 按一定比例混合:\(Lobe1⋅0.85 + Lobe2⋅0.15\)
-
间接反射:Specular IBL
改进的 SSAO
- AO 贴图混合了Bleed Color(皮肤通常取红色),使得皮肤渲染更加贴切,皮肤暗处的亮度和颜色更真实美观
Unity 方案 [Siggraph 2018]
薄物体透射
- Thickness Map:专门用于记录物体厚度的纹理
- Shadow Thickness:两层shadow 分别记录最远、最近深度来表示物体厚度
- 结合两种方案,使用 \(max(textureThickness,shadowThickness)\)
Nvidia 方案 [Siggraph 2021]
Realistic Digital Human Rendering with Omniverse RTX Renderer,基于 Participating Media 渲染模型。
Nvidia 的实现中,主要基于以下几点:
- 通过散射系数来决定距离采样
- 没有使用 NEE
- Single-sample spectral MIS
- Phase 函数使用各向异性 HG 函数(mean cosine is currently non-spectral)
- 输入、射出介质表面时,使用 Lambertian BTDF
- 对艺术家调参友好,支持 diffuse color 来反向计算出 单散射 albedo
实际效果:
参考文献
- [1] 《GPU Gems 3》:真实感皮肤渲染技术总结 | 知乎
- [2] 基于物理着色(四)- 次表面散射 | 知乎
- [3] 剖析Unreal Engine超真实人类的渲染技术Part 1 - 概述和皮肤渲染 | cnblog
- [4] 【02】实时高逼真皮肤渲染02 次表面散射技术发展历史及技术详细解释 2 | 知乎
- [5] Approximate Reflectance Profiles for Efficient Subsurface Scattering
- [6] Separable-Subsurface-Scattering
- [7] Rendering AAA-Quality Characters of Project A1
- [8] Manifold Next Event Estimation
- [9] Subdivision Next-Event Estimation for Path-Traced Subsurface Scattering
- [10] Practical and Controllable Subsurface Scattering for Production Path Tracing [2016] [Disney]
- [11] Path Traced Subsurface Scattering using Anisotropic Phase Functions and Non-Exponential Free Flights [2017] [Pixar Animation Studios]
- [12] Realistic Digital Human Rendering with Omniverse RTX Renderer | Nvidia | Siggraph 2021
- [13] Efficient screen space subsurface scattering | Unity | Siggraph 2018
施工中