Vertex Animation Texture 顶点动画贴图即VAT,顾名思义是一种将动画烘焙到贴图的技术,该技术能够充分利用图片格式并行存储动画所需数据。
在三维特效领域,常见的动画技术包括骨骼动画和变形器动画。我们先来回顾一下这两个动画技术。骨骼动画通过抽象出一根根首尾相接的“骨骼”(即节点向量),并将模型的顶点“蒙皮”到各个骨骼上,通过骨骼的位姿驱动对应一定区域内所有顶点按相应的比例移动。本质上是通过建立一个映射关系,通过更少数的有代表性的数据节点,分权重地驱动全量的数据。骨骼动画的优势是在制作形式上,骨骼和顶点的关系与真实世界骨骼和肢体的关系非常相似,制作者可以直观地移动骨骼结点,还原出复杂的肢体造型。二、变形器动画
变形器动画是通过定义模型所有顶点的一系列固定“造型”(即目标位姿),并在多个位姿之间混合,得到不同的排列组合效果。本质上是罗列了模型顶点所有可能达到的极限位置,通过排列插值得到中间效果。变形器动画的优势是造型关注的顶点细节均为手动雕刻的,可以精确还原顶点的细节,而造型间的切换通过差值生成不需要制作者过度介入,适合制作表情、布料等细节。因为以上两个动画技术具有面向制作者直观可控的特点,已经形成了成熟的工具链。但其背后的数据形态却十分庞杂,因此在使用这类动画时,引擎侧会有一定的性能压力。无论是骨骼还是变形器,因为其多级映射和排列组合的本质,需要存储模型每个顶点的若干映射关系,这就需要正比于顶点数量的庞大数据量来支持。因此这两类动画的文件大小往往是不带动画的模型文件的几倍。海量的数据同时也带来了读取的压力,为了播放这些动画,引擎需要逐一读取多层数据并进行加权计算,才能得到需要渲染模型的数据。而骨骼或变形目标层级越多,计算量也越大。这些数据往往是通过CPU串行读取和计算,效率不高。可以发现动画无论以什么形式制作,最终所需的数据仅仅是模型顶点的位置,引擎获取到这些顶点随着时间变化的位置信息即可渲染出动效。VAT技术就是面向应用侧,本质上是将动画的顶点信息存储为图片的形式直接对接渲染器,从而减少了数据存储空间和编解码性能损耗。
具体来说,将模型的顶点的信息一一写入到图片的每个像素,通过像素的颜色来表示该顶点的位置坐标。一个模型的顶点位置通常使用三维空间的坐标表示如x,y,z三个数值,而一张图片恰好有至少三个颜色通道如r,g,b。这样一个像素就足以存储一个顶点数据;而动画随时间变化的每一帧都会有一个新的顶点位置,对应的可以使用一系列像素记录每一帧的位置。综合来说一个模型的顶点在几千到几万的数量级,对应一张常见的图片在几百到几千像素的数量级,那么一张普通大小的图片就足以“摆放”几百帧左右的顶点动画数据,更多数据仅需扩大图片大小或使用多张图片即可。在读取数据时,引擎仅需要将图片连同模型通过常规的管线直接发送给GPU,再根据一定的顺序把图片像素中的颜色翻译成坐标,应用到模型的顶点位置上即可。而这个计算全部通过GPU并行计算,一次性即可计算数万个坐标,几乎不会有效率瓶颈。综合来看,VAT数据全部是渲染所需的“有用”信息,并没有其他类型所带的“冗余”的结点数据,可以说是其它动画类型的一个精简产物。也因此它可以兼容这些动画技术,在已有的成熟工具链制作的动画基础上,制作者都可以将最终动画转化为VAT格式。无论制作流程中应用了多少骨骼或变形结点,都不影响最终数据量的大小。这样的低存储空间和GPU加速的支持,使得VAT成为了移动端引擎动画技术的不二选择。
我们根据VAT所需要的数据,在maya中做了一个生成工具,在不改变模型的拓扑基础上,可以应用于任何形式的动画,包括骨骼、blendshape、变形器、动力学等,最终生成会生成一张顶点VAT贴图、一张法线贴图、一个存有相关信息的文件,并且会自动为模型生成第二套UV用于在shader中计算。图5 vat贴图生成
一、VAT贴图
每一个像素存储着一个顶点的xyz位置信息,为了归一化和尽量保持精度,我们会遍历整个动画找到x、y、z的最大值,用原始的xyz分别除以最大值,最后在shader中乘回去。图6 vat贴图编码
因为颜色精度为0-255,复杂动画有可能精度不够,所以为了应对不同动画,我们提供了低、中、高3种精度,低精度单帧单个顶点位置信息只用一个像素存储,中精度存储为两个像素,高精度为三个。同时我们还支持基于相对位置的信息,可以进一步提高精度和应用范围。二、法线贴图
法线贴图与VAT生成规则基本一致,只不过存储的顶点的法线信息,这里就不过多赘述了。
三、顶点UV
最后为了能在shader中顺利使用,必须要对模型生成对应的顶点UV,会根据设置的图片宽度以及顶点数量,横向排开,例如宽度设置为1024,那顶点UV每一行为1024个,多出来的继续往上叠加。在生成VAT、法线图时也是用的相同的规则。四、shader代码
因为不同的精度、贴图尺寸在shader中的计算有不同,为了能方便使用,会生成一份info文件,里面有在shader中如何计算的代码,直接复制粘贴就可以使用。既然VAT可以支持对骨骼和变形器动画的编码,实现对动画数据的精简和加速,快手在移动端特效上就尝试了使用VAT来制作。以下动画是人脸变形器动画,为了精准描述人脸张嘴、眨眼时的肌肉变化,制作者“雕刻”了61组基础表情来对应各个区域的模型形状。这些细微的顶点变化即使用较稀疏的密度也要2000个以上的顶点来描绘。这就意味着一套完整的人脸变形动画要存储61组2000点的坐标组合,这个数量级的数据采用常见的模型文件可能需要2-3MB的体积。而经过VAT编码后,采用一张1024x512左右的图片占用260KB的体积就存储了全部信息。而因为编码方式的“平铺直叙”,每个脸型坐标就是图片中的几行数据,播放动画也仅需简单地读取对应行的数据即可,仅需要非常轻量的成本即可实现和扩展此类动画,对开发和设计师都非常友好。同样的,在骨骼动画上也可以使用VAT来完美还原全身的复杂动画。相比于650kb的顶点蒙皮数据+95kb的动画数据,VAT使用了329kb的顶点数据+800kb的动画贴图,可以基本在同等数量级的数据上存储和还原动画数据。在此基础上,VAT还可以兼容多种动画同时播放。例如在上面的人物骨骼动画基础上,如果需要变形器动画如对发丝、衣服做些波动的物理模拟,也可以一起生成到VAT贴图中。因为统一使用VAT编解码,就可以不依赖系统同时支持解析骨骼和变形器,减轻了引擎的负担。而通过将不同的动画写入到图片的不同行列中,即可单独控制不同的播放速度和周期,简单的编码即可组合出复杂的动画效果。在移动端特效领域,图形处理器的能力越来越强,特效、动画也越来越丰富,但性能和存储空间的优化仍然是技术研发不变的目标。VAT技术很好地契合这个趋势,充分利用GPU算力,并用更少的数据空间展现更丰富的动画内容。同时VAT技术相对骨骼动画和形变动画在工具链上仍有其局限性,主要是由于VAT需要编码压缩数据,会将位置坐标和时间信息压缩在二维图片上,而不是像传统动画工具的样式在一维的时间滑条上展示坐标数据,也就无法让制作者直观的看到动画的变化趋势或快速定位某一时刻的动画形态。为此快手将在特效开放平台发力研发动画预览工具,提供更便捷的VAT动画制作和预览能力。除了骨骼和形变动画外,我们也在探索VAT在流体或粒子中的应用。流体模型可在每一帧生成不同的顶点拓扑,如模拟水流从少到多,再碰撞激起细碎浪花的造型。粒子模型可将大量多变的粒子面编码为有规律的图集,模拟丰富的视觉效果。扩大使用场景优化渲染效率,为用户带来更丰富的特效体验。
快手智能3D物体重建系统解析
快手数字美妆系列:星河高光效果解析
AI双眼皮,让您重焕“睛”彩
快手Y-tech部门致力于通过计算机视觉、计算机图形学、深度学习、AR/VR/HCI等多领域的交叉,帮助每个人更好地表达、创作以及互动。Y-tech在北京、深圳、Palo Alto均有研发团队。如果你对我们做的事情感兴趣,欢迎联系并加入我们!
Y-tech长期招聘(全职或实习生):计算机视觉、计算机图形学、UE/Unity开发、技术美术、AI推理引擎、AI工程架构、美颜/特效技术、平台/工具开发、技术产品经理等方向的优秀人才。联系方式:
y-techservice@kuaishou.com