细致到毛孔 ! 深度揭秘超真实皮肤的实时渲染技术

腾讯互娱NEXT研发中心有幸参与了MEETMIKE项目,几位实时渲染和图形学的研发人员帮助提升了数字人脸部皮肤的细节和真实性,与Epic Games合作开发完成了一套全新的复杂的皮肤着色器(Skin Shaders)。 在此,我们将分两部分为大家揭秘超真实皮肤渲染的相关技术。上篇为皮肤渲染的相关理论以及为了验证而做的LookDev,下篇为技术层面的详细介绍以及跟Epic大牛身上学到的技能点。

2017年7月底举办的计算机图形顶级会议Siggraph 2017中,一个致力于计算机技术以及图形研究的大型团队为世人展示了数字人科技的最新研究:利用最先进的画面捕捉技术、体感控制技术以及画面渲染技术在计算机中塑造人类的化身。其所用的技术为Epic Games在去年SIGGRAPH Real-time Live拿下大奖,并引爆了更多高质量实时表情捕捉的研究。

这个团队展示的项目名为《MEETMIKE》,著名的电影特效大师,Fx Guide网站创始人Mike Seymour 成为了其中的虚拟人物。在洛杉矶SIGGRAPH2017的VR Village现场,Mike Seymour作为MEETMIKE演示的主持人,在虚拟现实环境下对业内的资深人士和研发人员进行了采访,而由他所驱动的数字人则是在悉尼的一个虚拟演播室中。

在展会的每一天,Mike的数字分身都在和业界传奇和学术巨擘进行切磋。观众可以在VR中观看,也可以通过一个巨型屏幕围观。利用虚幻引擎刻画出的 Mike Seymour 角色非常的逼真,眉毛和眼睫毛都勾勒的惟妙惟肖,甚至连皮肤中的毛孔都清晰可见。

MEETMIKE项目所代表的是实时渲染技术的业界顶尖水平,同时也是虚拟数字人作为演员、代理和替身的崭新研究领域的关键部分。不难想象,数字人技术在未来有着更加广阔的发展空间和无限的可能。打个比方,随着虚拟人物的渲染成熟化,我们可以数字化王菲,并利用另一个演员去驱动“王菲”进行表演,在场观众还能与 “王菲”进行实时的互动,这无疑将成为一种全新的体验方式!

腾讯互娱NEXT研发中心有幸参与了MEETMIKE项目,几位实时渲染和图形学的研发人员帮助提升了数字人脸部皮肤的细节和真实性,与Epic Games合作开发完成了一套全新的复杂的皮肤着色器(Skin Shaders)。

在此,我们将分两部分为大家揭秘超真实皮肤渲染的相关技术。上篇为皮肤渲染的相关理论以及为了验证而做的LookDev(此部分较为复杂,如对技术理论无兴趣可直接跳过,不影响后续的工作);下篇为技术层面的详细介绍以及跟Epic大牛身上学到的技能点。

1.皮肤渲染理论

皮肤是一种属性比较复杂的材质,其物理结构由多层结构组成,其表面油脂层主要贡献了皮肤光照的反射部分,而油脂层下面的表皮层和真皮层则主要贡献了的次表面散射部分。实验测试表明,光线接触到皮肤时,有大约96%被皮肤各层散射了,只有大约4%被反射。见图1.

对于一般的材质采用BRDF(bidirectional reflectance distribution function)可以很好的表达,而对于皮肤来说因为其具有半透明属性光线会在皮肤的表层进行多次散射,散射根据其通过的路径衰减,简单来说就是光线会扩散到周围,这对于表现皮肤的质感起到很大作用。

模拟透明物体的方法有很多,例如Volumetric Path Tracing,Volumetric Photon Mapping和BSSRDF(Bidirectional Surface Scattering Reflectance Distribution Function)。BSSRDF目前是主流技术,其和BRDF的不同之处在于,BSSRDF可以指定不同的光线入射位置和出射的位(见图2)。Jensen在2001年的论文是次表面材质建模最重要的一篇论文[1],推导了许多重要的物理公式,计算模型,渲染时的参数转换,以及测量了许多生活中常见材质的散射系数等等。大部分后来的论文都是在基于这篇文章中的理论的一些提升。

对于BRDF模型来说,一次反射光照的计算是在光线交点的法线半球上的球面积分。而对于BSSRDF来说,每一次反射在物体表面上每一个位置都要做一次半球面积分,是一个嵌套积分。

其中BSSRDF的定义是:

Rd只接受一个标量参数,这个参数的意义是光线入射位置和初设位置的曼哈顿距离。直观的理解就是,BSSRDF尝试将光线在物体表面内部中数千次的散射后所剩余的能量用一个基于入射点和出射点之间距离的函数去近似只接受一个标量参数,这个参数的意义是光线入射位置和初设位置的距离。也就是说,BSSRDF尝试将光线在物体表面内部中数千次的散射后所剩余的能量用一个基于入射点和出射点之间距离的函数去近似。这个近似则是基于几个假设:

1.    次表面散射的物体是一个曲率为零的平面

2.    这个平面的厚度,大小都是无限

3.    平面内部的介质参数是均匀的

4.    光线永远是从垂直的方向入射表面。

正因为有这些假设,所以很容易把出射光的强度与出射点和入射点之间的距离用一个函数去近似。而真实的模型往往比理想中要复杂的多,光线也有可能从各个角度入射,因此通过BSSRDF渲染的结果会有一定误差。

Rd的求解非常复杂,通过近似可以得到

有了可以得到

其中

可以看出和自然指数有关系。

对于一个平面来说当激光垂直照射它时会发现光扩散到周围,形成以照射点为中心的光晕,如果物体的材质各项均匀其散射行为和角度无关,我们就可以用一个一维函数来描述,对于不同的材质RGB根据距离衰减的行为是不一样的。Dipole Profile就是用来描述光在物体内部的扩散(散射)行为,见图3.

Diffuse Profile

图3描述的Profile和高斯函数e-r2很类似,因此可以通过高斯函数来拟合,但是一个高斯函数是无法精确拟合Diffusion Profile,通过多个高斯函数可以很好的逼近。Wi为权重,Vi为高斯函数方差

多个高斯函数求和

多个高斯函数拟合Profile

从图4可以看出2个高斯函数和Profile的误差还是比较大的,4个高斯可以很好的逼近Profile[2]。图中采用的4个高斯:R(r) = 0.070G(0.036, r) + 0.18G(0.14, r) + 0.21G(0.91, r) + 0.29G(7.0, r)。

那么问题来了,这几个高斯函数的权重是和方差是如何得到的呢?这是一个很经典的问题,给你一条曲线,让你用多项式或者三角函数去拟合。自己求解太费事,对于经典的问题往往有现成的工具可以直接算出来,不用重复造轮子。经过一番搜索发现Matlab有一个曲线拟合功能就可以做这样的事情[3],

详见https://cn.mathworks.com/help/curvefit/gaussian.html

这里只列出重点的内容,Matlab通过高斯函数拟合最多可以支持8个高斯函数(图5),图6是用2个高斯函数进行拟合的例子。

Matlab中多个高斯拟合

通过2个高斯函数拟合曲线的例子

对于大部分透明物体像牛奶,大理石一个Dipole Profile足以,但是对于皮肤的这样的材质拥有多层结构,用一个Dipole Profile不能达到理想的效果,通过3个Dipole可以接近Jensen论文中的根据测量得出的皮肤Profile数据。3个Profile通过前面描述4个高斯函数不能得到很好的逼近结果,实验发现通过6个高斯可以得到很不错的结果。

同样可以用前面提到的Matlab的拟合功能求解。图6是对应的高斯函数的参数,图7是其对应的Shader代码,图7是通过6个高斯拟合皮肤3层Dipole Profile的RGB对应的衰减,可以看出在红色比绿色和蓝色扩散的远得多,图8是通过图表和曲线的方式来可视化。

通过6个高斯模拟Dipole Profile的Shader代码

图表和曲线可视化Dipole Profile

有了描述光线如何在半透明物体扩散的Dipole Profile,接下来就可以对附近的像素进行加权求和了,这个求和的过程其实是根据Dipole Profile对周围的像素进行Blur。常用的做法有两种:Texture Space Blur,Screen Space Blur          Texture Space Blur

2007年GDC有一篇nVidia的文章名字叫做“Advanced Skin Rendering”[4],里面采用Texture Space Blur的技术就是GPU Gems3中“Advanced Techniques for Realistic Real-Time Skin Rendering”所描述的,这个技术在屏幕空间做了6次高斯模糊,每一个高斯模糊就是Dipole近似所采用的高斯模糊的参数(图9)。Texture Space Blur有一个很严重的问题,Texture一般都在4k,做一次高斯模糊都是很费的操作,更不要说6次高斯模糊。因此虽然当年这个技术取得的效果很不错,但是最少有人采用。

Texture Space Blur

Screen Space Blur     

和Texture Space Blur不同Screen Space Blur(图10)只需要处理被Stencil标记过的Skin的像素,极大地降低了Blur的像素数目,可以很大程度的提升性能。

Screen Space Blur

虽然Screen Space Blur性能好很多,做6个高斯模糊需要12个pass(一个高斯模糊对应一个水平和垂直模糊),Jorge通过水平和垂直卷积2个Pass来近似[5](图11 Separable Convolution),效率更进一步提升,这要是目前游戏里采用的主流技术,Unreal也将其集成进来。

Separable Convolution

2.UE4需要改进的方向

Jorge在SIGGRAPH的演讲《Next Gen Character Rendering》详细介绍了在角色渲染中采用的各种新技术,主要包括皮肤和眼睛两大模块。基于屏幕空间的皮肤次表面渲染技术很快被Unreal集成进来,但这只是《Next Gen Character Rendering》中关于皮肤渲染最基本的技术,除此之外还包括:两层高光(2 Specular Lobes),皮肤透射(Backlit Transmit),16k高精度贴图。Infinite-Realities网站有一篇文章讨论了UE4关于皮肤需要改进的地方,有兴趣的可以去看看。http://ir-ltd.net/ue4-skin-shader/

Epic希望在MeetMike的demo中能对皮肤作出改进,很荣幸我们这次和他们一起合作,这些功能的提升就是由我们和Epic一起开发的。经过一番讨论我们决定对如下方面做出改进:

1.    2 Specular Lobes

2.    Backlit Transmit

3.    Disney SS Profile

4.    16k Scanned Texture Resolution

3. Mike LookDev

为了验证最终的皮肤效果,需要拍摄大量的照片作为参考。摄像机角度,光源参数都需要尽量用UE4模拟出来,并且最大程度接近。这是一件非常严谨的事情,任何一步出问题都会导致参考数据没有参考价值,这个过程被称为Look Dev。Look Dev的目的就是在UE4中模拟真实灯光,相机和拍摄环境。一旦Look Dev环境搭建起来就可以和拍摄的参考照片进行比较,起到验证皮肤的算法是否正确的作用。

Area Light

这次主要用到的拍摄的参考照片都是在摄影棚完成的,摄影棚的灯光都是面光源,这种光源UE4中目前还没有,而面光源是可以通过很多个聚光灯近似的。Epic的Level Artis采用蓝图生成了一个n*n的聚光灯阵列,可以非常方便的模拟出摄影棚的光源。见图12。

Camera

UE4的摄像机模型已经可以很好的模拟真实相机,只需要参数配置正确就可以生成和真实相机一样的图像。

LightStage

因为光源可以是任意的,每个照射角度都需要被验证。因此在LightStage中生成了这样一组参考图。LightStage是一个球形,上面有很多盏灯,可以理解为一个球面上分布了很多灯,LightStage按照顺序每次只亮一盏灯,并且拍摄参考照片,这样采集出来350张参考照片,每张照片对应的Camera位置和朝向都是可以从LightStage中得到的(图12)。

LightStage拍摄的真实照片

对应于LightStage,Epic的Level Artist开发出一个可以通过蓝图控制的LightStage,通过一个参数CurrentRow可以控制当前LightStage的哪个方位的灯被点亮(图13)。有个数组文件按顺序保存LightStage每盏等的位置和朝向,这里的灯光就是前面提到的Area Light。

蓝图模拟的LightStage

LightStage灯光变化的过程通过蓝图来控制,每一帧对应一个灯光的位置,通过将每一帧图像渲染到图像中可以生成整个图像序列(图14),每帧图像都和LightStage拍摄的参考照片一一对应。

Sequence 截图

UE4渲染出来的LightStage截图

RV

Look Dev渲出来的图像必须和LightStage的参考图像进行对比,最大可能的接近参考图像。Shotgun RV是一款功能非常强大的图像和视频软件,可以非常方便的比较两组序列图像和视频。RV最常用的两种模式是Tile和Wipe,Tile方式可以同时显示2组序列中的图像,布局可以自由调整,左右或者上下布局都可以;Wipe则是两组图像重叠,通过拖动条可以很方便的调整图像的可见区域,最有用的方式就是左右拖动顶层图像的拖动条,这样可以和下面的图像做像素级对比(图16)。UE4渲出来的图像和Mike在LightStage拍摄的参考图片可以精确的到达像素级匹配,说明当时拍摄时Mike一直保持不动,UE4的相机还原了真实相机。

通过RV比较渲染出来的截图和真实照片

参考文献

[1].   Jensen, Henrik Wann, Stephen R. Marschner, Marc Levoy, and Pat Hanrahan. 2001. "A Practical Model for Subsurface Light Transport." In Proceedings of SIGGRAPH 2001.

[2].   Eugene d'Eon, David Luebke. GPU Gems 3, Chapter 14. Advanced Techniques for Realistic Real-Time Skin Rendering

[3].   Matlab online doc https://cn.mathworks.com/help/curvefit/gaussian.html

[4].   d'Eon, Eugene."NVIDIA Demo Team Secrets–Advanced Skin Rendering." Presentation at Game Developer Conference 2007. Available online at http://developer.download.nvidia.com/presentations/2007/gdc/Advanced_Skin.pdf.

[5].   Jorge Jimenez, Károly Zsolnai, etc. Separable Subsurface Scattering

发表回复