MRが楽しい

MRやVRについて学習したことを書き残す

頂点カラーシェーダを使ってSetPassCallとBatchesを減少させてみる

本日は Unity の小ネタ枠です。
今回は SetPassCall と Batching の理解のため、頂点カラーシェーダを使ってこれらを減少させてみます。

前提条件

前回記事の続きです。
bluebirdofoz.hatenablog.com

SetPassCall

SetPass Call は CPU から GPU へのデータの受け渡しの呼び出し回数になります。
この回数が増加すると、CPU オーバーヘッドが発生し、CPUのボトルネックとなります。
docs.unity3d.com
f:id:bluebirdofoz:20200827220834j:plain

SetPass Call が発生するタイミングにマテリアルデータの受け渡しがあげられます。
このため、マテリアルインスタンスを減らすことで SetPass Call を減らすことができます。

3つのオブジェクトを3つのマテリアルで表示する

以下の通り、3つのオブジェクトを3つのマテリアルで表示するシーンを作成してみます。
f:id:bluebirdofoz:20200827220845j:plain

この場合、それぞれのオブジェクトのマテリアル毎に SetPass Call が発生します。
結果、バッファのクリアを合わせた 4 回の SetPass Call が発生しています。
f:id:bluebirdofoz:20200827220857j:plain

3つのオブジェクトを1つの頂点カラーマテリアルで表示する

次に、メッシュに頂点カラーを設定して1つの頂点カラーマテリアルで表示するシーンを作成してみます。
f:id:bluebirdofoz:20200827220910j:plain

この場合、SetPass Call が発生するのは頂点カラーのマテリアルのみになります。
結果、バッファのクリアを合わせた 2 回の SetPass Call が発生しています。
f:id:bluebirdofoz:20200827220922j:plain

更に各オブジェクトは同じマテリアルを利用しているので、Batching を利用することも可能です。
メニューから Edit -> Project Settings.. を開き、[Player]の[Other Settings]から[Dynamic Bathing]を有効化します。
f:id:bluebirdofoz:20200827220932j:plain

Batches の数が 2 になりました。
3つのオブジェクトには同一のマテリアルインスタンスが利用されているため、Dynamic Bathing によって描画がまとめられたためです。
f:id:bluebirdofoz:20200827220943j:plain

参考ページ

esprog.hatenablog.com