ShaderTips

シェーダーTips

主にUnityシェーダーについての記事を書いています。

【Unity】GPU インスタンシング、Static Batching、Dynamic Batching、SRP Batcherを解説

BatchとDraw CallとSetPass Call

Batchは同一マテリアルである等のバッチング条件を満たした結合メッシュ単位の描画処理を指します。

SetPass Callはマテリアルの設定値をCPUがGPUに送る処理です。

Draw CallはCPUがGPUに、描画を命令することです。

CPUからGPUへの命令は負荷が高いため、SetPass CallとDraw Callはなるべく減らしたいところです。

GPU インスタンシング

GPU インスタンシングを使用すると複数の同一メッシュ・同一マテリアルを1回のDrawCallで描画することができます。

Static Batching

シーン内の静的オブジェクトをゲーム実行時にコンバイン(複数のオブジェクトを一つのオブジェクトとして合体)して、ドローコールを削減します。 ゲーム実行時にコンバインを行うので、処理負荷が軽減できます。

Dynamic Batching

Dynamic Batchingは同じマテリアルを適用のオブジェクトをリアルタイムでコンバインします。 これによりドローコールとセットパスコールを1回で行うので、処理負荷が軽減できます。

しかし、コンバイン自体に負荷がかかるため、CPU負荷がかかるデメリットがあります。 また、頂点属性900以下かつ頂点数300以下のメッシュにしか使用できないなど他にも細かい条件があるため、デフォルトでオフになっています。

SRP Batcher

SRP BatcherはURPで使用できるバッチング機能です。 Dynamic Bachingとは異なりドローコールは描画する数だけ発行されますが、セットパスコールは一回のみです。 SRP Batcherの素晴らしい点はSRP Batcherを適用できる条件の緩さです。 以下が条件です。

・シェーダーが同一でシェーダキーワードが完全一致している場合、メッシュやマテリアルが異なっていても動作する

・オブジェクトはメッシュ内に存在しなければならない。パーティクルやスキンメッシュでは要件を満たせません。

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

・ほとんどすべてのプラットフォームで動作する OpenGL ESは3.1以上

設定方法

Scriptable Render Pipeline AssetのSRP BatcherをONにします。 (デフォルトでONになっています)

シェーダーのSRP Batcher対応

プロパティをCBUFFER_START(UnityPerMaterial)〜CBUFFER_ENDで囲います。

CBUFFER_START(UnityPerMaterial)
float4 _MainTex;
half4 _Color;
half _RimPower;
CBUFFER_END

必要なプロパティ全てを必ず含めるようにしてください。 余計なプロパティが混ざっていたとしても、そのPass内で参照されていないならコンパイラが自動で削除してくれるので気にする必要はありません。

参考

light11.hatenadiary.com

blog.unity.com

light11.hatenadiary.com