目录
最近在做一个数字人渲染DEMO,本博客将用于记录搜集到的 Skin Rendering 技术,持续更新中。
在渲染皮肤时主要关注以下光照路径:
镜面反射:6%入射皮肤的光被皮肤最上层油脂菲涅尔反射
次表面散射(Subsurface Scattering,SSS):94% 的光进入皮肤次表层,在围绕进入点的 3D 邻域中返回和离开表面。现实的皮肤介质是多层的,而较物理的渲染一般建模成至少两个不同的层。散射路径还可进一步细分为单次散射和多次散射的路径:
透射 [可选]:对于较薄的物体(如耳朵边缘、鼻子边缘),光射入的平面和射出的平面很可能是不一样的。实际上如果次表面散射的路径实现的足够物理,自然而然也会包含透射现象,因此该光路是可选的
光线进入 shading point 周围的像素后经过在散射介质内部的随机游走(Random Walk),可能会从 shading point 射出。但 SSS 的光线在散射介质中的游走行为难以模拟,为了达成实时渲染的性能要求,便有了以下思路:
图左是 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 描述了光线如何在半透明物体中进行扩散和分布,其函数形式如下:
\(R_{d}\left(\left\|p_{i}-p_{o}\right\|\right)\)
其实就是一个记录了 BSSRDF 答案的二维 LUT ,输入参数是单散射的albedo和距离。
实际上 Diffusion Profile 就是预计算散射光线在介质内部的 Random Walk 行为,然后做成 LUT 以供 BSSRDF 快速查询结果,从而达成实时渲染的性能需求。
常见有计算 Diffusion Profile 的方法:
将 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}\)
偶极子方法实在太老而且极子部分涉及的物理知识完全没学过,没什么参考价值还是跳过把。
用若干个高斯函数去拟合 Diffusion Profile:
放弃物理,直接拟合。
\(R_{d}(r)=\frac{e^{-r / d}+e^{-r / 3 d}}{8 \pi d r}\)
渲染任何阴影贴图
渲染拉伸校正贴图(可以是预先计算的)
渲染辐照度纹理
纹理模糊:
在 3D 中渲染网格:
Pre-Integrated Skin 是一个远远脱离物理基础的算法,其特点主要是高效、简单、视觉可接受
核心思路:
预先对纹理进行卷积,而不用运行时卷积。
查找表的参数分别是dot(N,L)和曲率,这两者结合就可以反映出光照随着曲率的变化。
BSSRDF 实质就是进行一次2D卷积运算,可分离的卷积核就是在寻找一个可分离的核来表示的 Diffusion Profile 的近似,然后转成两个1D 卷积 Pass ,让时间复杂度从O(n^2)=>O(n)
如图,先经过一次 X 方向的卷积 Pass ,再经过一次 Y 方向的卷积 Pass 就能得到相当于 2D 卷积的效果,最后再添加 Specular 就能得到很好的 SSS 材质效果。
注:不可以先添加 Specular 再进行卷积,不然会出现明显的 aritifact (例如高光处被卷积成十字形状)
\(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)\)
前提是假设 \(E\) 可分(相当于假设平面曲率为0),然后根据下列公式推导,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) = ((E * a_p)*a_p)(x, y)\)
具体实现 :
注:即使E实际不可分,作者认为预计分可分离核的使用效果仍然足以接受,因此目前仍广泛适用于各类实时BSSRDF皮肤渲染上
额外处理工作:
抖动 Jittering:paper 使用的一个可分核的扩散近似,在入射辐射度发生高频变化的地方会产生人工痕迹。这是因为信号的空间占用(尺寸)比核的宽度更小,从而产生不对称的星形图案。因为本文使用的近似核不是完全经向对称的
\(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)}\)
重要性采样:
绝大部分 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 是描述次表面散射最精确的模型,它描述了光线传播时因散射、吸收而导致的变化率方程:
\(\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 渲染方程,它更加精确但也是计算量最大的方法,基于该方法的基本都是离线的体积渲染方法:
图左是 BSSRDF 渲染模型做的,图右是Participating Media 渲染模型做的
phase 函数表示了每对传入传出方向的能量分配概率。
相当多的次表面散射的扩散模型假设各向同性,不捕获各向异性散射。这样简化的各向同性 phase 函数:
\(p=\frac{1}{4\pi}\)
常用的各向 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的增长,越来越呈现各向同性。
获得与 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相位函数是一个很好的能量守恒近似。
Diffusion-based 近似现在仍然广泛使用,在假设介质是半无限长的平板(semi-infinte slab)的情况下,可以有很好的效果。而 MC 方法才能表现出物理正确,尤其在皮肤边缘处(例如鼻子边缘、耳朵边缘)更加符合现实。
图左是 normalized diffusion,图右是 path-traced SSS
核心思路:已知摄像机到散射介质内表面的折射路径 \(x_a,x_1,x_b\),然后在面光源上采样一个点 \(x_c\),连接 \(x_b、x_c\) 为种子路径 \(Y\),然后根据采样半程向量 \(h\) 的结果,来不断迭代让路径 \(Y\) 折成可以满足折射规律的可接受的路径 \(X\)
传统的游走路径最终的 BTDF 可能很难打在光源上(图左),而SNEE的主要想法是通过一条额外的子路径来满足折射规律的情况下还能直接打到光源上。
采样边界顶点 \(x_k\),两个采样子路径:
不同散射介质适用不同的nee技术:
距离采样
固定步长,无重要性
根据单一波长的消散系数,适用于单色介质:\(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是不同的),例如皮肤介质中的红光比其他波长传播得更远
方向性采样
Dwivedi Sampling
将这些采样方法通过 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\) 是散射距离。
先算出输入单散射 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)}\)
Realistic Digital Human Rendering with Omniverse RTX Renderer,基于 Participating Media 渲染模型。
Nvidia 的实现中,主要基于以下几点:
实际效果:
皮肤毛孔及其它皮肤表面细节导致了皮肤的各向异性,对于不同的地方应该有不同的specular、roughness等参数,一般是混合额外的细节贴图,这样就可以增加镜头很近时的皮肤细节
接近物理真实的渲染:\(cavity \cdot Specular(gloss) \cdot Fresnel(reflectance)\)
近似渲染: \(Specular(gloss) \cdot Fresnel(cavity \cdot reflectance)\)
cavity是凹陷度,可从cavity map(下图)中采样获得;Specular(gloss) 表明高光项;Fresnel(reflectance) 是与视觉角度相关的反射
直接反射:采用 双镜叶高光(Dual Lobe Specular),即两个 Cook-Torrance 的 BRDF Lobe 按一定比例混合:\(Lobe1⋅0.85 + Lobe2⋅0.15\)
间接反射:Specular IBL
Separable SSS:
Burley Normalized SSS:
Both:
手机扫一扫
移动阅读更方便
你可能感兴趣的文章