テラシュールブログ

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

【Unity】パーティクルにモデルを使いたい

f:id:tsubaki_t1:20160630235130j:plain

今回はパーティクルにモデルを使用する方法と、モデルを使用した際「色」を設定出来るシェーダーについてです。

パーティクルをモデルで表現する

Unityのパーティクルシステムは、初期設定ではビルボード(常にカメラの方を向く板ポリゴン)を使用していますが(殆どのケースでコレで問題ない)、メッシュを使用して絵を表現する事も出来ます。

f:id:tsubaki_t1:20160701002005j:plain

やり方は単純、ParticleのRenderのRenderModeをMeshに変更し、表示したいメッシュを表現するだけです。

残念ながら出来るのはMeshなので「アニメーション付きキャラクターを大量に表示」みたいな事は出来ませんが、単一のメッシュならばこんな感じで表現出来ます。

f:id:tsubaki_t1:20160701002126j:plain

ちなみに、幾つかの種類のメッシュを持っていても、メッシュを結合+マテリアルは一つのため、あまり描画命令は発行されません。また、描画割り込みが無い限りSetPassも1だったりします。
意外と効率的に描画してくれています。

f:id:tsubaki_t1:20160701004203j:plain

パーティクルに色を設定したい

メッシュを表現していますが、それが同一の色しか表現出来ないのではつまらないです。なので色を付けようと思います。状態によって変化するタイプの色です。

本来パーティクルで色を塗るのは割と簡単です。Particleの名前のついたシェーダーを設定し、Color over Lifetime(生存時間内の色の変化)やColor By Speed(速度による色の変化)を使うだけで色が変わります。

f:id:tsubaki_t1:20160630235504j:plain

f:id:tsubaki_t1:20160701003525j:plain

ですが、これをMeshのパーティクルに適応すると一つ問題が起こります。Particleのシェーダーは基本的に半透明で加算/減算される事を想定しているため、半島名特有の奥行き問題が発生します。

パーティクルにはSorting Modeがあり、ある程度の描画方針は制御出来るのですが、それは色々と面倒くさいです。

f:id:tsubaki_t1:20160630235806g:plain

この問題を解決するため、また綺麗な質感を表現するためにStandard Shaderをシェーダーに採用してみます。
この場合は割とマトモにモデルは表現出来るのですが、今度は色を設定する事ができなくなります。

f:id:tsubaki_t1:20160630234619g:plain

パーティクルの色を設定するには

パーティクルの色は頂点カラーです。なので、メッシュを描画する際にパーティクルの頂点カラーを色に流し込んでやれば、綺麗に色を塗ってくれそうです。

 

Unity 2017系以降であれば、Standard Particle Shaderを使用します。

tsubakit1.hateblo.jp

 

 

ソレ以前の場合は、下のようなシェーダーを使います。

 

gist.github.comこのシェーダーでは、頂点カラーも使用して色を補正しています。

f:id:tsubaki_t1:20160630235130j:plain

パーティクルにメッシュを使用する問題点

Unity 2018.1以降

以前は重かったのですが、Unity 2018.1からGPU Instancingに対応したため、こと描画の面においてはかなりの高速化が果たされました。

移動がGPUではなくCPUなので、残念ながら膨大な量を出す事は出来ませんが、単純なモジュールを利用する場合においては非常に高速です。

tsubakit1.hateblo.jp

Unity 2018.1以前

Unity 2018.1以前は、以下の内容が当てはまります。

 

パーティクルにメッシュを使用した際の問題点ですが、まず重いです。まぁ、GameObjectを並べるよりは圧倒的に軽いのですが、ビルボードと比較すると重いです。その為、パフォーマンスで問題が出るようならスプライトアニメーションに差し替えるのが良さそうです。

 

また、1パーティクルシステムで表示出来る最大ポリゴン数に制限があります。合計で524280ポリゴンになると、それ以上のポリゴンを表現出来なくなります。
それ以上の表現を行いたい場合、もう一つパーティクルシステムを配置する必要がありそうです。

f:id:tsubaki_t1:20160701003314j:plain

参考

answers.unity3d.com

関連

tsubakit1.hateblo.jp

tsubakit1.hateblo.jp

tsubakit1.hateblo.jp