【Unity】シェーダーで3Dモデルのアニメーションを行う Animation Texture Baker
今回はシェーダーで3Dモデルのアニメーションを行います。
シェーダーで3Dモデルのアニメーションを行う
最近流行りのアプローチの一つに、シェーダーでモデルのアニメーションを行う…という物があります。
例えば各頂点のXYZ等の情報をテクスチャのRGBAに格納し、それの読み取り位置を時間でズラす事により、キャラクターのアニメーションを実現する…的な感じです。
この辺りはUnite 2017のインスタンシング公演で少し触れた他、最近のUniteでは割と何度も取り上げられている項目だと記憶しています。
とりあえずやってみる
作ってみようと思いましたが、既に良い感じのがあったのでソレを使います。
Animation Texture Bakerの導入
Animation Texture Bakerを導入します。
詳しく確認していませんが、AnimationBakerがあれば多分OKです。
テクスチャでアニメーションするモデルの導入
次にモデルとアニメーションを入れます。
この機能はスライドや動画で思想を把握する限り、頂点数やアニメーションの長さに限界があります。また、メッシュは出来れば単一であることが望ましいです。
また Animation Texture Bakerの制限で、Animation(レガシー)のものしか使用できません。
ので、それを実現出来るモデルを引っ張ってきます。
例えば http://u3d.as/9WKとか
インポートしたアニメーションのタイプはLegacyに設定します。
アニメーションの変換
シーンにAnimation付きのモデルを配置し、Animation Texture Bakerをセット、
再生ボタンを押してゲームを再生します。
これでBaked Animation Texフォルダに、シェーダーでアニメーションを行うPrefabが生成されます。
このPrefabをシーンに配置すれば、CPUに頼らずアニメーションしてくれます。
アニメーションをループさせたいならばマテリアルのLoopにチェックを入れたり、時間をズラシたいならDelta Time、速度を変更したいならAnimation Lengthの値を少しいじればOKです。
GPU Instancingに対応してみる
初期状態はGPU Instancingには対応していないので、Instancingに対応的な事を軽くしてみます。
Shaderに#pragma multi_compile_instancingとか UNITY_VERTEX_INPUT_INSTANCE_IDとか、UNITY_SETUP_INSTANCE_ID(v);を追加して、物によってはUNITY_INSTANCING_CBUFFER_STARTとかも追加、
後はGraphics.DrawMeshInstancedで描画します。
これで1023体のゾンビを描画しても、殆どCPU負荷無く描画できています。
Unityが動作する最近のモバイル(MetalやOpenGLES3やVulkan)はインスタンシングが使えるので、割と動きます。*1
Graphics.DrawMeshInstancedIndirectで座標計算をCompute Shaderにやらせれば、CPU負荷は殆ど消せるかもしれません。対応面倒なんでやってませんが。
関連
https://t.co/QTAvVIXsbr をインスタンシング対応して、1万5千頭の馬に(個別にタイミングをズラした)アニメーションを再生させてみる #unity pic.twitter.com/vd6y1OeA08
— 椿 (@tsubaki_t1) 2017年8月31日