要在游戲中用到強大而有擴展性的骨骼動畫,有很多注意點.
首先,我們得棄用CPU蒙皮, 雖然兼容性好,但是面對現今多核但并不提高單核速率的情況下,GPU還是王道.而且GPU蒙皮代碼可能更簡單,不過也有一點小缺點, 對于小引擎來說,Shader必須給靜態模型和骨骼動畫模型寫兩套.
其次我們需要加強一個SubSkin的骨骼支持數量. 骨骼動畫上的每個SubSkin都是一次Draw, 但是按照傳統骨骼動畫系統,每個骨頭對應一個矩陣傳入,那么SM2.0保守計算只能支持50根骨頭. 不過在我前段時間的文章中有提到這個技術.并且已經在我的骨骼動畫系統及OGRE中實現,效果很好.
美術也許很反感一個人物做1個SubSkin, 他們更新好多個SubSkin,也就是說身體每個部分都是一個SubSkin, 這樣方便修改, 同時系統支持的骨骼數量還可以有一定量的上升.不過我們還需要做一個索引工作. 傳統的GPU骨骼動畫中總是在渲染SubSkin前傳入所有這些SubSkin需要用到的骨骼矩陣. 但是每個SubSkin并不一定能用到所有的這些矩陣,這明顯是一種浪費. 因此在OGRE中做過一次索引預處理,也就是將每個SubSkin用到的骨骼統計出來, 在渲染這次SubSkin時才重新傳到GPU. 很明顯,這是用速度還空間和兼容性. 如果在DX10以上,有ConstantBuffer還好. DX9實在太慢了
使用Marker點的換裝系統很難處理例如貼身衣物這類物件換裝. OGRE中有一種共享骨骼的技術, 可以支持, 不過從代碼分析看來,這種技術對CPU端骨骼計算量實在是大的驚人. 因此我們決定將整個SubSkin(也就是SubEntity)換掉,這樣由美術根據不同換裝類型來將衣服在MAX中直接綁定好后直接替換原始模型中的SubSkin即可達到換裝效果.可以說這是從動態計算到靜態預處理的轉變,效率提升很多.