一种针对移动端的头发建模和渲染方案
2018-12-15孙正忠
孙正忠
(1.中国科学院上海微系统与信息技术研究所上海200050;2.上海科技大学信息科学与技术学院,上海201210;3.中国科学院大学北京100049)
在计算机图形学和三维人体重建领域,头发的建模和渲染一直以来都是最具有挑战性的部分。近年来,随着虚拟现实(Virtual Reality,VR)和增强现实(Augmented Reality,AR)的崛起,虚拟人物越来越多的出现在我们的移动设备中。利用数十台相机搭建的360度光场环拍系统可以对真人进行动态的采集和重建,使人体的三维模型可以栩栩如生的呈现在人们面前[1]。但是头发由于其数量众多,纤细以及半透明等特点,在人体的三维重建中一直都是最难重建的部分之一,往往最终也只能以面片和贴图的形式来进行渲染呈现。这就大大影响了人物模型在移动端中的显示效果。
而在电影和动画片的制作中,为了得到高质量的头发渲染效果,通常需要对发丝来进行高精度的人工建模,并结合基于物理的头发渲染算法,通过多重反射和折射,历时几个小时最终才能渲染出一张高质量的图像[2]。这在对实时性要求很高的VR和AR应用中是难以接受的,尤其要放到移动端的话,这更是不可能的事情。
文中将提出一种适用于移动端的头发建模和基于发丝的实时渲染的解决方案。开发者可以利用玛雅(Maya)等常见的三维建模软件,快速建模发丝,并直接导入移动端进行高质量的实时渲染。
1 头发建模
如今最常用的三维建模软件主要有3dsMax和Maya。在3ds Max中主要以Cem Yuksel博士的Hair Farm毛发制作插件最具代表性[3]。而Maya汇集了当今最先进的头发建模方法[4],并提供了多种多样的头发建模插件和工具。例如 nHair,Shave,Yeti,XGen,XGen交互式修饰等。这些插件建模头发的主要思路总结起来有两种方式[5-9]:
1)选定一块头皮,在该头皮上建模主头发线条,以此来确定发型的基本形状,软件会根据主头发线条自动插值出更多的发丝,进而形成较为浓密的头发。例如nHair,XGen等工具。这种方法比较适用于长发的建模。
2)软件根据所选定头皮自动生成头发,用户可以改变头发的长度和浓密,并利用提供的笔刷像理发一样对生成的头发进行修剪和造型,将其塑造成自己想要的样子。例如XGen交互式修饰。这种方法对于短发的建模非常好用。
2 头发渲染
2.1 移动端头发渲染方法
目前移动端用到的头发往往是面片加贴图的形式[10],如图1所示。虽然比较生硬,效果不够真实,但是由于其建模简单,渲染速度快等优点,目前仍是移动端头发渲染的首选。而通过发丝渲染出来的头发,能够看到一根根发丝飘逸的效果,具有极佳的视觉效果[11-12],如图2所示。但由于其巨大的计算量,在移动端往往无法支撑如此高质量的渲染。因此,如何在移动端实现快速的发丝渲染就成了众多图形学开发者研究的方向。
2.2 光照模型
目前基于发丝的头发渲染使用最广泛的光照模型是Kajiya-Kay[13]和Marschner[14]两种模型。
图1 游戏天剑中的头发
图2 通过发丝渲染出来的头发效果
2.2.1 Kajiya-Kay光照模型
Kajiya-Kay光照模型是最早提出的针对头发的光照模型,由于其良好的渲染效果而被广泛应用。该光照模型把头发的光照看成由漫反射和镜面反射两部分共同作用的结果,并用一个光滑的、半径很小的圆柱体来近似表征一根发丝。
图3 Kajiya-Kay光照模型
Kajiya-Kay光照模型中重要的向量和角度,如图3所示。其中,单位切线向量(t)表示头发的切线方向,光线向量(l)指向光源的方向,反射向量(r)指向反射光的方向,即最大镜面反射的方向。眼睛向量(e)指向观察者眼睛的方向。角度θ和φ分别是切线向量和光线向量的夹角,切线向量和眼睛向量的夹角。
根据Lambert光照模型,漫反射部分的光强可以通过以下公式来计算:
其中,Kd表示漫反射的系数。
由于头发表面具有光滑的特质,光线在头发表面会形成高光。Kajiya-Kay光照模型给出的镜面反射强度计算公式如下:
其中,Ks表示镜面反射的系数。
将漫反射和镜面反射部分结合起来,再加入环境光的部分就是头发完整的光照计算公式:
其中,Li表示光照的强度,Ka表示环境光的反射系数,La表示环境光的强度。
2.2.2 Marschner光照模型
Marschner光照模型是在对头发物理结构进行研究的基础上,测量出3维空间中光线在头发上发生散射后不同方向上的辐射强度,根据光线在头发上的散射规律,推导出的一种可行的光照模型。
Marschner光照模型把入射光线分成3部分:第一部分是反射光线(R),这一部分光线并没有进入头发,而是在头发表面直接反射。第二部分是折射-折射光线(TT),这一部分光线进入头发中,在头发表面发生了两次折射。第三部分光线是折射-反射-折射光线(TRT),这一部分光线在头发表面发生了两次折射,在头发内部表面发生了一次反射。光强的计算公式如下:
其中,PathR,PathTT和PathTRT分别对应上述入射光线的3种情况。这虽然近似模拟了真实光线照射到头发上可能发生的3种情况,但也大大增加了光照渲染的计算量,令人遗憾的是,渲染效果提升并不明显。
因而,由于Kajiya-Kay光照模型计算相对简单,在效果和速度上能取得很好的平衡,所以本文将采取Kajiya-Kay光照模型在移动端进行渲染。
2.3 TressFX头发渲染技术
早在2013年,显卡厂家AMD就在游戏《古墓丽影》中推出了基于发丝的头发实时渲染技术。
TressFX技术通过DirectCompute接口进行编程,能够充分发挥出真正全新下一代图形架构(Graphics Core Next,GCN)的大规模并行计算能力,从而获得以往需要预先渲染才能实现的图像品质[15]。同时TressFX基于当前的次序无关透明技术(Order Independent Transparency,OIT)工作,这种方法使用了单像素链接列表(Per-Pixel Linked-List,PPLL)数据结构来管理复杂的渲染过程及内存使用[16]。是否开启TressFX的渲染效果对比,如图4所示。
图4 游戏《古墓丽影》中未使用(左)和使用(右)TressFX的渲染效果图
虽然TressFX具有极佳的头发渲染效果,能够渲染出很好的自阴影和半透明效果。但是复杂的运算也对GPU的性能提出来很高的要求,目前只能在高性能独立显卡上运行,不能在移动端使用。
3 工作流程
3.1 基于Maya的头发建模
本文将以XGen交互式修饰为例,这种方法是Maya近两年推出的一种建模头发的方法,因其使用简单快捷,受到广大开发者的青睐。
XGen交互式修饰提供了一系列专用于创建所有头发和毛发样式的完整工具,其中包括雕刻笔刷、修改器和雕刻层。
交互式修饰描述和修改器是基于Maya的节点,因此它们可以在节点编辑器中进行操纵。这些节点在系统的图形处理单元(GPU)上进行计算,使笔刷笔划可以实时显示,从而提供无需预览生成的交互式工作流。虽然交互式修饰头发的所有数据都将保存到Maya场景文件中,但用户还可以将修饰保存到基于Alembic的缓存文件。
使用XGen交互式修饰建模头发的流程可总结如下,其中每一步对应的结果如图5所示。
1)确定虚拟角色模型的待生成头发区域,即表示头皮的部分网格模型,本文称作头皮网格(可以是三角形网格或四边形网格);
2)为选取的头皮网格创建交互式修饰样条线;
3)使用XGen自带的修改器和修饰笔刷,对头发进行造型。同时,可以利用Maya自带的Arnold渲染器实时预览头发。
4)为头发添加噪声,设置卷曲程度,使其更加逼真。
3.2 利用Python脚本导出发丝曲线
图5 XGen交互式修饰工具建模头发过程
利用XGen交互式修饰建模出来的头发,由于所有数据都保存在Maya场景文件之中,因而只能在Maya中进行渲染和使用。但Maya本身是支持脚本语言的,这为我们导出头发数据创造了可能。Maya主要支持的脚本有两种[17],分别是MEL和Python。前者是Maya自己的脚本语言,有着自己的语法规则,而对Python语言的支持则使更多的开发者可以通过使用脚本来处理Maya中的数据。
为了可以在移动端的渲染程序中使用建模的发丝模型,首先需要利用Maya自带的工具将其保存到基于Alembic的缓存文件。然后,使用Maya打开刚刚存下来的缓存文件(abc格式),我们可以看到里面的发丝是非均匀有理B样条(Non-Uniform Rational BSplines,NURBS)曲线的形式。现在,我们就可以在Maya中运行编写好的提取发丝的Python脚本,将一根根NURBS曲线以自定义的顶点数和格式存下来,以供渲染程序使用。
3.3 头发渲染的OpenGL ES实现
为了实现在移动平台上进行实时渲染的目的,我们使用OpenGL ES来进行渲染。OpenGL ES是OpenGL三维图形API的子集,针对手机、PDA和游戏主机等嵌入式设备而设计。与只可以在iOS中使用的Metal不同,OpenGL ES在Android和iOS等移动设备中均可以使用,这将大大方便我们将代码移植到其他移动平台[18-19]。
使用OpenGL ES进行对发丝进行渲染的总体流程如表1所示。
4 实验结果与分析
4.1 移动端不同发型的渲染效果
如图6所示,分别是在移动端对基于发丝的长直发,长卷发和短发的渲染效果。我们可以清楚的看到头发反光的高光部分以及发尾一丝丝的头发,当转动头发模型的时候,高光也会随之产生相应的改变,十分真实。尤其是在短发模型中,同时载入利用光场重建出来的人体头部模型和Maya中建模的头发模型,分别对二者进行渲染,在实现了极佳的头发渲染效果的同时,也增强了头部模型的真实性。上述3个头发模型的发丝数和顶点数如下:
表1 使用OpenGL ES进行渲染的总体流程
图6 不同发型的移动端实时渲染效果
1)长直发:10 000根发丝,160 000个顶点。
2)长卷发:10 000根发丝,687 532个顶点。
3)短发:33 636根发丝,538 176个顶点。
4.2 不同性能手机上头发渲染速度
我们在自iPhone 5s以来的多款苹果手机上对于图6所示的3种头发模型进行了渲染速度的测试。
由于垂直同步的原因,在iPhone上渲染帧率最高为60帧每秒(Frame Per Second,FPS)。从表2可以看出,在iPhone 5s以后的这几款机型,即便是对于具有上万根发丝、数十万个顶点的头发模型,本文的渲染速度均可保持在25FPS以上,基本可以达到普通应用的渲染要求。尤其是在iPhone 6s以后的机型,渲染速度可以达到60FPS满帧,这足以满足移动端VR和AR应用的需求。这就为在移动端VR和AR应用中实时渲染高质量头发奠定了坚实的基础。
表2 不同手机渲染帧率对比表
5 结束语
本文提出了一种针对移动端的头发建模和渲染的方案,使得开发者可以快速在Maya中建模发丝模型并导出到移动端进行高质量的实时渲染。该方案流程相对简单,同时取得很好的头发渲染效果,非常具有实用价值。
不过目前的头发渲染效果与TressFx还有一定差距,主要是没能处理好头发的半透明和自阴影的问题。随着VR和AR技术的发展,Unity3d逐渐成为移动端VR和AR应用最主流的开发工具。后续的工作将针对渲染效果和渲染速度进行优化,并制作头发建模和渲染的Unity3d插件,便于VR和AR开发者的使用和集成本文的方案。