骨骼动画的计算,是比较费时的,因为数据量大.
这部分数据,用CPU计算,就是软件蒙皮,用GPU去计算,就硬件蒙皮
1.软件蒙皮
Ogre本身已经实现了软件蒙皮,默认情况下就是软件蒙皮,计算的代码在void Entity::updateAnimation(void)
2.硬件蒙皮
需要用shader,把计算放到GPU里面去处理,而shader的代码,也不用自己去写,Ogre本身例子就带有一个支持2个权重的顶点程序,
因为一个顶点最多绑定4个骨头,最多4个权重,所以顶点也稍微麻烦,要4种情况都实现,那么,配置顶点程序就应该在代码里面动态添加,而不是写在.material里面.
更好的是用火炬之光的硬件蒙皮,有一套完整的实现,
我们需要硬件蒙皮么?答案是现在的每个3D游戏,都应该有.
天龙和火炬之光都用到了硬件蒙皮,因为他能大大地提高运行速度,
而火炬之光,唯一用到的shader程序,就硬件蒙皮,然后就找不到其他任何shader程序了.
所以,硬件蒙皮应该算是最重要的shader程序,效率啊.
我们用Ogre本身的例子来测试速度
6个人,132和198的fps,差距还是不小,
//////////////////////////////////////////////////////////////////////////////////////
另外,如果用了shader程序,那么我前面提到的XRAY的实现方法就要改了
因为前面的方法是针对固定渲染管线的,我是禁止渲染状态改变的方法来实现的,如果有shader程序,禁止了就不行
不过可以采用另外的方法,就是等pass的属性设置到渲染状态以后,我再更改渲染状态,在哪改?在SubEntity中重写下面的函数,
就可以在渲染前任意更改了
virtual bool preRender(SceneManager* sm, RenderSystem* rsys)
{ (void)sm; (void)rsys; return true; }