赞
踩
上一篇讲了一些关于静态物体lightmap的GPU Instancing支持流程,这篇文章总结一下关于GPU骨骼蒙皮动画的GPU Instancing支持,在过程中遇到的一些问题以及解决方案。
简单介绍一下骨骼动画,在已经定义好的骨骼结构方案上进行蒙皮,然后在此基础上做动作驱动模型的动画,蒙皮过程可以在CPU,也可以在GPU实现。对于引擎而言,一般过于复杂的骨骼动画蒙皮过程都会在CPU完成,比如我们最常见的动作融合,Unity也是如此。
我们知道,骨骼动画的每一帧在底层都是矩阵运算,通过矩阵运算重写对象的顶点信息(VBO),再由CPU写入FrameBuff并提交DrawCall,这基本上就是动态模型一帧渲染的流程(当然实际情况要比这复杂得多),这也就是我们众所周知的,为什么骨骼数如果没有限制,会导致CPU跑满的情况,从而不难理解,Unity对于动态合批的种种限制。
那如果把蒙皮的过程放在GPU,再引入GPU Instancing进行优化重复性操作的方式可行吗?答案是肯定的,当然也会有一些限制,就是上面提到的类似于动作融合、还有骨骼部位分离动画,IK动画等都不能使用。
工作流程和原理:将骨骼动画每帧的矩阵运算数据写到一张纹理,然后将VBO和这张纹理同时提交给GPU,之后的蒙皮操作就会在GPU进行了,VBO相当于提供了一份vector buffer,这样每帧的数据都在这个vector buffer中找到索引,对于GPU来说在绘制每帧的时候就能在这个vector buffer找到对应索引,因此只保存一份通过索引的方式GPU就可避免重复的操作。虽然在内存的角度上会有所增加,但这种方式会大大提升CPU的效率,实际项目可以运用在NPC、路人、大量的观众,从而提高效率。
接下来依旧要说一下在实现过程中遇到的坑:
1:写入的矩阵数据纹理的大小要按照项目的要求进行,另外纹理的精度不用太高。
2:由于是按动作分类,同屏绘制角色不同动作和相同动作,合批数量是不同的。
1023颗草+10000的人的DrawCall数量是111,表示还是挺高的。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。