テラシュールブログ

旧テラシュールウェアブログUnity記事。主にUnityのTipsやAR・VR、ニコニコ動画についてのメモを残します。

【Unity】シェーダーで3Dモデルのアニメーションを行う Animation Texture Baker

f:id:tsubaki_t1:20170903220052g:plain

今回はシェーダーで3Dモデルのアニメーションを行います。

シェーダーで3Dモデルのアニメーションを行う

最近流行りのアプローチの一つに、シェーダーでモデルのアニメーションを行う…という物があります。

例えば各頂点のXYZ等の情報をテクスチャのRGBAに格納し、それの読み取り位置を時間でズラす事により、キャラクターのアニメーションを実現する…的な感じです。

f:id:tsubaki_t1:20170903221135j:plain

 

この辺りはUnite 2017のインスタンシング公演で少し触れた他、最近のUniteでは割と何度も取り上げられている項目だと記憶しています。

www.slideshare.net

とりあえずやってみる

作ってみようと思いましたが、既に良い感じのがあったのでソレを使います。

github.com

Animation Texture Bakerの導入

Animation Texture Bakerを導入します。

詳しく確認していませんが、AnimationBakerがあれば多分OKです。

f:id:tsubaki_t1:20170903222051j:plain

テクスチャでアニメーションするモデルの導入

次にモデルとアニメーションを入れます。

この機能はスライドや動画で思想を把握する限り、頂点数やアニメーションの長さに限界があります。また、メッシュは出来れば単一であることが望ましいです。

また Animation Texture Bakerの制限で、Animation(レガシー)のものしか使用できません。

 

ので、それを実現出来るモデルを引っ張ってきます。

例えば http://u3d.as/9WKとか

f:id:tsubaki_t1:20170903221528j:plain

インポートしたアニメーションのタイプはLegacyに設定します。

f:id:tsubaki_t1:20170903222130j:plain

アニメーションの変換

シーンにAnimation付きのモデルを配置し、Animation Texture Bakerをセット、

再生ボタンを押してゲームを再生します。

f:id:tsubaki_t1:20170903222336j:plain

これでBaked Animation Texフォルダに、シェーダーでアニメーションを行うPrefabが生成されます。

このPrefabをシーンに配置すれば、CPUに頼らずアニメーションしてくれます。

f:id:tsubaki_t1:20170903222557j:plain

f:id:tsubaki_t1:20170903223511j:plain

アニメーションをループさせたいならばマテリアルのLoopにチェックを入れたり、時間をズラシたいならDelta Time、速度を変更したいならAnimation Lengthの値を少しいじればOKです。

f:id:tsubaki_t1:20170903222736j:plain

GPU Instancingに対応してみる

初期状態はGPU Instancingには対応していないので、Instancingに対応的な事を軽くしてみます。

Shaderに#pragma multi_compile_instancingとか UNITY_VERTEX_INPUT_INSTANCE_IDとか、UNITY_SETUP_INSTANCE_ID(v);を追加して、物によってはUNITY_INSTANCING_CBUFFER_STARTとかも追加、

f:id:tsubaki_t1:20170903223858j:plain

f:id:tsubaki_t1:20170903225018j:plain

後はGraphics.DrawMeshInstancedで描画します。

これで1023体のゾンビを描画しても、殆どCPU負荷無く描画できています。

Unityが動作する最近のモバイル(MetalやOpenGLES3やVulkan)はインスタンシングが使えるので、割と動きます。*1

f:id:tsubaki_t1:20170903224959j:plain

 Graphics.DrawMeshInstancedIndirectで座標計算をCompute Shaderにやらせれば、CPU負荷は殆ど消せるかもしれません。対応面倒なんでやってませんが。

関連

 

www.youtube.com

 

 
 

*1:現在のAndroidの最低バージョンは4.1なので、OpenGLES3はそこそこ動きます。4.3未満が切れれば…