【Unity】Particle SystemにおけるGPUインスタンシングの用法・用量を理解して正しく使う

Particle SystemにおけるGPUインスタンシングの基礎知識と注意点をまとめました。

Unity2019.4.0

GPUインスタンシング?

GPUインスタンシングとは、要は「同じモデル一回の一気にいっぱい描画できる」機能です(適当な説明)。
一気にいっぱい描画するので、パーティクルのようなものに正しく使えば処理負荷が抑えられます。

インスタンシングの効果を感じるためにまず以下のようなヤバいパーティクルを作ってみます。

  • Max Particles: 10000
  • Emission > Rate over Time : 1000
  • Render Mode: Mesh
  • Mesh: Sphere(頂点数多いので)

これを表示してみるとPCでも17FPSです。ヤバいですね。

f:id:halya_11:20200626001121p:plain
ヤバい

ここでGPUインスタンシングを有効にしてみます。
なんと1861FPSになりました。ヤバいですね(良い意味で)。

f:id:halya_11:20200626001720p:plain
ヤバい(良い意味)

非Particle SystemのGPUインスタンシングとの違い

さてここからはParticleSystemでGPUインスタンシングを使う上で必要な基礎知識をまとめていきます。

Unityでは基本的に(=ParticleSystem以外は)以下の記事のようにマテリアルのEnable GPU Instancingにチェックを入れることでGPUインスタンシングを有効化します。

light11.hatenadiary.com

しかしながら、Particle Systemだけはインスタンシングを実現する技術的なバックグラウンドが異なり、したがって設定方法も異なります。
Particle SystemにおけるGPUインスタンシングの使い方は以下の通りです。

  • Render ModeをMeshにする
  • Enable Mesh GPU Instancingにチェックする

f:id:halya_11:20200626002945p:plain
GPUインスタンシングを有効化

またシェーダやハードウェアがインスタンシングに対応している必要があります。
これについては次節で説明します。

対応しているシェーダが必要

ParticleをGPUインスタンシングするためにはシェーダがインスタンシングに対応している必要があります。
これは非Particle SystemのシェーダをGPUインスタンシング対応させるのとは方法が全く異なるので注意してください(具体的な方法は別記事にまとめる予定です -> まとめました)。

また、UnityのレガシーではないParticle用シェーダはGPUインスタンシングに対応しています。
具体的には以下の二つのシェーダが対応しています。

  • Particles > Standard Surface
  • Particles > Standard Unlit

対応しているGPUが必要

GPUインスタンシングはGPUの機能を使うため、GPUが対応していないと使えません。
シェーダには#pragma target 4.5の記述が必要になります。

docs.pumachen.xyz

すなわちOpenGL ESだと3.1相当になります。

docs.pumachen.xyz

これは非Particle Systemのインスタンシングよりも厳しい制約なので注意してください。

関連

light11.hatenadiary.com

light11.hatenadiary.com

参考

docs.pumachen.xyz

docs.pumachen.xyz