骨骼動畫的計算,是比較費時的,因爲數據量大.
這部分數據,用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; }