在Unity里写一个VAT工具

高自动化,兼具性能利用,简化流程。

VAT(Vertex Animation Texture)概述

常规Skinned Mesh Animation在运行时要经过采样骨骼动画,CPU / GPU 蒙皮的计算,再进行绘制,运行效率受到骨骼数量的影响比较大,难以支持蒙皮动画角色数量比较多的场景。例如SLG战棋游戏,需要同屏千人以上,但是每个角色模型动画都比较简单,这就可以直接把动画的顶点偏移信息存在贴图上,在渲染的时候shader里采样VAT贴图设置偏移顶点,免去了动画Skinning的计算。同时这些角色模型可以走GPU Instancing或者SRP Batch,大大节省了动画性能开销,在移动端做同屏千人也毫无压力。

一般用Houdini就可以做,UE也有插件可以做,但最后还是要手动在引擎里配置。所以在引擎里写一个更方便,可以根据自己的需求高度定制。

下载链接:VATBaker.zip 提取码: nuc4

使用方式

解压后放在Unity引擎Asset根目录即可。

用于Bake的动画模型导入设置要填legacy类型,

从顶部栏WalkingFat > VAT Baker打开工具。

  1. 首先把需要bake的动画资产放在场景上,并且配置好所有动画Clip。
  2. 然后在工具面板里选择场景里的这个资产,工具会自动找到所有关联的Clip。
  3. 最后点击Bake按钮。稍等片刻会在工具目录的Output目录里自动生成新Mesh和VAT图

然后重新组装,把新的Mesh放到场景上,用Assets/Tool/VATBaker/Shader/VAT_Lit.shadergraph新建VAT材质,贴上bake出来的两张图,并且填上动画时常和顶点最大偏移量(这个信息放在VAT图的命名里了)。

大功告成!下图左边是VAT,右边是原动画,毫无差别。

工具的实现方案

每一个顶点Vertex动画的数据相当于贴图的1×64像素的一段。默认VAT宽度尺寸是512,一行就等于8段1×64的vertex动画数据。以此类推往上叠加。512×512的贴图就等于8 x 512 = 4096个顶点数据。所以工具设置的VAT图最大尺寸是512×512,支持最大顶点数4096。而一行64个像素的数据也是足够5秒左右的动画表现流畅。

Bake的VAT图有两张

  • 顶点的object space的Offset(float3)
  • 顶点动画后的Normal OS(float3)

为了提高精度使用,这两张图格式是RGBA8888未压缩。并且把float3以R11G11B10的精度压缩到RGBA8888里,在Shader里再Decode出来。

多个动画Clip会bake成多套VAT贴图。每个动画需要设置时常和最大Offset量来最大化的利用数据精度,让每个动画clip尽量流畅。因为数据精度就是R11G11B10而已,动画的顶点偏移量和时长都会影响最终表现是否流畅。

当然最好把多个动画拼在一张图里,这样更加优化。以后有时间再做。