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