本日は Unity の小ネタ枠です。
今回は SetPassCall と Batching の理解のため、頂点カラーシェーダを使ってこれらを減少させてみます。
前提条件
前回記事の続きです。
bluebirdofoz.hatenablog.com
SetPassCall
SetPass Call は CPU から GPU へのデータの受け渡しの呼び出し回数になります。
この回数が増加すると、CPU オーバーヘッドが発生し、CPUのボトルネックとなります。
docs.unity3d.com
SetPass Call が発生するタイミングにマテリアルデータの受け渡しがあげられます。
このため、マテリアルインスタンスを減らすことで SetPass Call を減らすことができます。
3つのオブジェクトを3つのマテリアルで表示する
以下の通り、3つのオブジェクトを3つのマテリアルで表示するシーンを作成してみます。
この場合、それぞれのオブジェクトのマテリアル毎に SetPass Call が発生します。
結果、バッファのクリアを合わせた 4 回の SetPass Call が発生しています。
3つのオブジェクトを1つの頂点カラーマテリアルで表示する
次に、メッシュに頂点カラーを設定して1つの頂点カラーマテリアルで表示するシーンを作成してみます。
この場合、SetPass Call が発生するのは頂点カラーのマテリアルのみになります。
結果、バッファのクリアを合わせた 2 回の SetPass Call が発生しています。
更に各オブジェクトは同じマテリアルを利用しているので、Batching を利用することも可能です。
メニューから Edit -> Project Settings.. を開き、[Player]の[Other Settings]から[Dynamic Bathing]を有効化します。
Batches の数が 2 になりました。
3つのオブジェクトには同一のマテリアルインスタンスが利用されているため、Dynamic Bathing によって描画がまとめられたためです。