实时&离线皮肤渲染技术(Real-time & Offline Skin Rendering)

本博客将用于记录搜集到的 Skin Rendering 技术,持续更新中。

目前还有相当些错误,正在修改中(目前简单实现了一下皮肤渲染的demo,但还在继续改进 XD)

现实皮肤模型

在渲染皮肤时主要关注以下光照路径:

  • 镜面反射:6%入射皮肤的光被皮肤最上层油脂菲涅尔反射

    • 实现例子:dual specular BRDF

    14fig03.jpg

  • 次表面散射(Subsurface Scattering,SSS):94% 的光进入皮肤次表层,在围绕进入点的 3D 邻域中返回和离开表面。现实的皮肤介质是多层的,而较物理的渲染一般建模成至少两个不同的层。散射路径还可进一步细分为单次散射和多次散射的路径:

    • 单散射:在介质内部只散射了一次的光照贡献,与光线角度相关性大
    • 多散射:在介质内部散射了2次或更多次的光照贡献(也是diffuse现象的主要来源,而皮肤主要贡献便是多散射)
    • 实现例子:BSSRDF

  • 透射 [可选]:对于较薄的物体(如耳朵边缘、鼻子边缘),光射入的平面和射出的平面很可能是不一样的。实际上如果次表面散射的路径实现的足够物理,自然而然也会包含透射现象,因此该光路是可选的

    • 实现例子:BTDF with thickness map & shadow thickness

BSSRDF 着色模型 [2001]

光线进入 shading point 周围的像素后经过在散射介质内部的随机游走(random walk),可能会从 shading point 射出。

img

但 SSS 的光线在散射介质中的游走行为难以模拟,为了达成实时渲染的性能要求,便有了以下思路:

  • 提供一个类似于 BRDF 的函数(也就是 BSSRDF),但输入参数从4D(入射方向、出射方向)变成了8D(入射点位置、入射方向、出射点位置、出射方向)
  • 太远的像素对 shading point 的散射光贡献极小,因此可以忽略它们,只对一定范围内的表面 A 进行积分
img

图左是 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) \]

其输入参数是距离(即 \(\|p_{i}-p_{o}\|\))和单散射Albedo(它是一个常系数,往往作用是直接相乘,从而可以调整各个颜色通道的贡献率)

实际上,diffusion profile 就是预计算散射光线在介质内部的 random walk 行为,然后做成 LUT 以供 BSSRDF 快速查询结果,从而达成实时渲染的性能需求。

14fig09.jpg

此外,可以看到这个距离模型其实是忽略形状的,只是简单的输入两点间距离,虽然简单,但是实际效果还是相当能接受的。

14fig10.jpg

常见有计算 diffusion profile 的方法:

  • 偶极子(Dipole)[2002]
  • 多级子(Multipole)[2005]
  • 高斯和(Sum-of-Gaussians)拟合 [2007]
  • Burley Normalized Diffusion 拟合 [2015]

偶极子、多极子方法是早期用来计算 diffusion profile 的离线模拟方法,而高斯和、Burley normalized diffusion 则是已有精确 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)}} \]

漫反射近似:假设两次及以上的散射事件导致了光分布的均匀,因此这部分散射视为漫反射。使用偶极子来表示入射光源分布,上面为正的真实光源,下面为负的虚拟光源。

image-20211128161658294

仍然采用蒙特卡洛方法,取 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层高斯和的参数如下:

14fig13.jpg

该 6 层高斯和对应的函数图:

14fig14.jpg

Burley Normalized Diffusion [2015]

放弃物理,直接用纯数学(一个数学公式)的方法拟合 diffusion profile:

\[R_{d}(r)={A}\frac{e^{-r / d}+e^{-r / 3 d}}{8 \pi d r} \]

其中,A 是 Surface Albedo(或者说单散射 Albedo),d 是用来控制这条曲线的参数。

我们希望 diffusion profile 有这么一个好的性质:当 Surface ,调低单散射 Albedo 时,

img

上面这张图是 Burley 他们使用这篇文论中 [6] 的着色模型得到的参考数据,参数的模型选用的是 A(Surface Albedo)和 Diffuse Mean Free Path Length[公式]

实际上还有很多因素影响最终的散射结果,包括入射光的角度,介质本身是否 isotropic 等。不过为了简化近似复杂度,有些因素会被舍弃掉。

所以,我们通过调整 d,来让整个近似的曲线可以根据 A 的变化达到正确的近似结果。这里多说一句,论文中也提到这个拟合曲线的背后来源,正是受到了业界越来越多的使用简单曲线拟合复杂曲线的案例启发,比如我们熟知的菲涅尔项等。

想要“正确的”得到 d 值,我们可以根据上面的曲线算出一张 d 表,然后根据实际的 A 值插值出求出 d。这样做虽然有误差,但从结果来看,范围大概在 4.9% 左右,是一个很不错的结果。

当然,除了查表以外,还可以使用简单的函数来拟合出 A 和 d 的对应关系。论文中给出了几种不同的版本,每个版本假设的前提条件稍微有些区别,我挑了其中一个函数,对应上 A 之后,曲线大概是这样:

preview

Burley Normalized Diffusion 的特点是:

  • 开销低,精确度却相当逼近基于蒙特卡洛暴力积分的无偏解
  • CDF 有解析解,可进行重要性采样(importance sampling)优化
  • 和高斯和拟合相比,Normalized Diffusion 不能使用分离核方法,也就是说它必须得老老实实进行 2D 卷积 Pass,因此性能要求更高

可以看到这个拟合效果比起偶极子好上很多:

7e1c50f8956fc87ee61fda566f09c5f8

基于模糊的 SSS 方法

重温一遍上面得到的基于 BSSRDF 渲染方程:

\[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 \]

\[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) \]

就会发现对表面积分和卷积(模糊)基本就是一回儿事,只不过每个 sample 的权重基本上取决于 diffusion profile,因此我们可以通过 Blur 方法来实现 BSSRDF 的渲染。

纹理空间模糊(Texture Space Blur) [2003]

img

总体流程:

  1. (可预计算)计算出一张 stretch texture(拉伸校正贴图),表示每个 texel 应该进行多大范围的 blur

  2. 渲染出一张 irradiance texture

  3. 纹理空间模糊:

    • 卷积核的权重:由高斯和拟合的 diffusion profile 确定
    • 卷积核的半径:由 stretch texture 提供半径拉伸系数
    • 根据每个高斯核来对 irradiance texture 进行 Blur 得到一些模糊好的 textures 并保存起来
  4. 对皮肤 Mesh 进行渲染时:

    • 根据 texcoord 分别采样这些模糊好的 textures 以给定的权重混合起来得到 diffuse 结果
    • 根据每个光源给添加 specular 结果

屏幕空间模糊(Screen Space Blur) [2009]

img

核心思路:

  • 只需要对屏幕中 Stencil 标记过的 Skin 像素进行若干卷积操作,极大地降低了 Blur 的像素数目
  • 卷积核的大小:根据当前像素的深度 z(x,y) 及其深度两个方向的导数来确定

Pre-Integrated Skin(预积分的皮肤着色)[2010]

img

Pre-Integrated Skin 是一个远远脱离物理基础的算法,基于 Texture Space Blur,其特点主要是高效、简单、视觉可接受

核心思路:

  • 预先对纹理进行卷积,而不用运行时卷积
  • 查找表的参数分别是dot(N,L)和曲率,这两者结合就可以反映出光照随着曲率的变化

Separable SSS(可分离的次表面散射)[2015]

Separable Subsurface Scattering [2015]

BSSRDF 实质就是进行一次 2D 卷积运算,可分离的卷积核就是在寻找一个可分离的核来表示的 diffusion profile 的近似,然后转成两个1D 卷积 Pass ,让时间复杂度从O(n^2)=>O(n)

如图,先经过一次 X 方向的卷积 Pass ,再经过一次 Y 方向的卷积 Pass 就能得到相当于 2D 卷积的效果,最后再添加 Specular 就能得到很好的 SSS 材质效果。

注:不可以先添加 specular 再进行卷积,不然会出现明显的 artifact (例如高光处被卷积成十字形状)

高斯和函数的卷积核:传统拟合方法;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)\)

具体实现

  1. 需提前有一份较精确的 diffusion profile(如6个高斯和拟合成的 \(R_d\) 函数),然后对 \(R_d\) 进行预先卷积(对距离的积分)得到 \(a_p(offset)\) 函数,换句话说就是一张一维表(输入一个 \(offset\) 值,输出一个 \(a_p\) 值)
  2. 在具体实现中,则使用 N 个 sample 来取代这张一维表,规定好每个sample 的 offset 值和计算出对应的 \(a_p\) 输出值
  3. 将这个 sample list 传给 shader,让 shader 根据这些配置好的 sample 进行两次 1D 卷积 Pass

注:即使E实际不可分,作者认为预计分可分离核的使用效果仍然足以接受,因此目前仍广泛适用于各类实时BSSRDF皮肤渲染上

额外处理工作:

  • 抖动 jitter: paper 使用的一个可分核的扩散近似,在入射辐射度发生高频变化的地方会产生人工痕迹。这是因为信号的空间占用(尺寸)比核的宽度更小,从而产生不对称的星形图案。因为本文使用的近似核不是完全经向对称的

    image-20211206153516816
    • 对1D过滤器作用一个随机旋转(逐个像素)
    • 这种方式不需要对进行重新预积分,因为核的宽度并没有变化
    • 为了减少计算负荷,作者只对靠近像素的采样进行处理(10%),增加区域可以取得更好的效果,看下图区别:
image-20211206153638984
  • 核的宽度:卷积核的尺寸受一个于深度相关的拉伸因子

\[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 着色模型

image-20211128170325457

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} \]

image-20211201152655702

\(\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

图左是 BSSRDF 着色模型做的,图右是Participating Media 着色模型做的

image-20211128170320424

Phase 函数

phase 函数表示了每对传入传出方向的能量分配概率。

各向同性 Phase

相当多的次表面散射的扩散模型假设各向同性,不捕获各向异性散射。这样简化的各向同性 phase 函数:

\[p=\frac{1}{4\pi} \]

各向异性 Phase

image-20211201153141562

常用的各向 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-infinite slab)的情况下,可以有很好的效果。而 MC 方法才能表现出物理正确,尤其在皮肤边缘处(例如鼻子边缘、耳朵边缘)更加符合现实。

图左是 normalized diffusion,图右是 path-traced SSS

image-20211202130146661

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(λ)\) 的概率,所谓吞吐量其实就是通道的贡献度,贡献度越高的通道更容易被选取

image-20211130180558091

RGB三种波长的消散系数往往是不同的(transimittance是不同的),例如皮肤介质中的红光比其他波长传播得更远

方向性采样

  • 假设各向同性时,无重要性
  • 假设各向异性时,根据 Phase 函数分布做重要性采样(皮肤介质的 g 参数大约是0.8)

Dwivedi Sampling

  • 根据介质厚度“bias”一下采样来增加 random walk 返回到入射平面或者从另一个出射平面射出的机会,从而加速收敛
  • 需要先通过一个探测射线来估计物体厚度,而且需要将该物体假设为曲率为0的平板物体
image-20211202135113978

将这些采样方法通过 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\)

image-20211205164205714

Subdivision Next-Event Estimation,SNEE [2016]

Subdivision Next-Event Estimation for Path-Traced Subsurface Scattering [2016]

传统的游走路径最终的 BTDF 可能很难打在光源上(图左),而SNEE的主要想法是通过一条额外的子路径来满足折射规律的情况下还能直接打到光源上。

image-20211204210344351

采样边界顶点 \(x_k\),两个采样子路径:

  • 一个从光源出发的自顶向下路径(NEE)
  • 一个根据 Phase 函数分布的自底向上路径(正常的 Phase 函数分布采样)

image-20211204215421513

不同散射介质适用不同的 NEE 技术:

  • 高密度介质,如皮肤, 仅需要在最后一个点做 NEE
  • 对于低一些密度的介质,例如水或者液体,需要在内部每个游走点(单散射的)做 NEE,并且使用 transparent shadows 来通过几何
  • 对于散射介质含内部表面,如眼球,可以使用MNEE产生焦散,随着在介质的透射距离而减弱

image-20211204221754230

工业界实现方案

UE5 MetaHuman 方案

Base Pass:提供出 G-Buffer: albedo, roughness, normal 等属性

Lighting 相关 Pass:根据 G-Buffer 计算出 irradiance 和 AO

SSS 相关 Pass

  • InitGroupCounter
  • Setup(Checkerboard)
  • BuildIndirectArgs
  • FillMipsConditionBufferCS
  • GenerateMips
  • PassOne_Burley
  • PassTwo_SepHon
  • PassThree_SepVer
  • PassFour_BVar
  • Recombine(FullRes High Checkerboard Tiled)

使用 Separable SSS/Burley SSS/Both 实现基于屏幕空间的模糊

Separable SSS:

  • 通过6个高斯和预计算profile,再用预积分的可分离核去近似拟合profile,运行时便是2个pass
  • 后处理:基于屏幕的模糊,且仅用两个pass(横向、纵向)去实现模糊,时间复杂度 O(n^2)=>O(2*n)
  • 性能更优,但精确度不够

Burley Normalized SSS:

  • 基于 Burley Normalize Diffusion
  • 后处理:基于屏幕的模糊,使用2D卷积
  • 精确度更好,但性能开销更大

Both:

  • 尚未看完源码,还不清楚怎么将这两种技术结合的

Nvidia 方案 [SIGGRAPH 2021]

Realistic Digital Human Rendering with Omniverse RTX Renderer,基于 Participating Media 着色模型。

image-20211129113728027

Nvidia 的实现中,主要基于以下几点:

  • 通过散射系数来决定距离采样
  • 没有使用 NEE
  • Single-sample spectral MIS
  • Phase 函数使用各向异性 HG 函数(mean cosine is currently non-spectral)
  • 输入、射出介质表面时,使用 Lambertian BTDF
  • 对艺术家调参友好,支持 diffuse color 来反向计算出 单散射 albedo

实际效果:

image-20211201162455216

杂项

下面是一些可能可以参考的小方案。

皮肤 specular lobe [Unreal]

单一的 Cook-Torrance lobe 可能不够体现皮肤的 specular lobe,可以采用 双镜叶高光(Dual Lobe Specular),即两个 Cook-Torrance 的 BRDF lobe 按一定比例混合:\(Lobe1⋅0.85 + Lobe2⋅0.15\)

img

改进的 AO [Unreal]

AO 可能意味着被周围的皮肤遮挡住了环境光,但实际上这些周围的皮肤也可能会贡献反射或投射的光照。因此 AO 可以混合 bleed color(通常取红色),让皮肤遮蔽处深黑偏红一些,皮肤暗处的亮度和颜色更真实美观。

202111261654242

薄物体透射 [Unity] [SIGGRAPH 2018]

图片1

为了实现薄物体的透射(BTDF)效果,可以这么做:

  • Thickness Map:专门用于记录物体厚度的纹理
  • Shadow Thickness:两层shadow 分别记录最远、最近深度来表示物体厚度
  • 结合两种方案,使用 \(max(textureThickness,shadowThickness)\)

参考文献

施工中

posted @ 2021-12-22 18:22  KillerAery  阅读(5037)  评论(3编辑  收藏  举报