色やテクスチャを変えるとマテリアルが増える
UnityはGetComponent<Renderer>().material.color = 色;とかでマテリアルの色を変更する事が出来ますが、これを行うとマテリアルが追加で一つ作られます。
異なるマテリアルは一括で描画出来ないので、内容物が同じであっても別々のレンダリングパスで描画される事になります。そうなるとSetPassが増え、またMaterialも別物として生成されるので消費メモリも僅かに(数kbytesくらい)増えます。
もしコレが、マテリアルの設定が「同一・もしくは僅かに異なる」ようなケースの場合、MaterialPropertyBlockを使うと多少効率的に描画出来、またマテリアルも増やさないように出来ます。
MaterialPropertyBlockを使用する
MaterialPropertyBlockを使用する場合は、MaterialPropertyBlockを生成し、そこにマテリアルの情報を流し込み、それをレンダラーに渡すだけです。
テクスチャや色といった情報は、シェーダーに渡します。渡せるシェーダー情報はEdit ShaderのPropertiesで調べる感じです(表記名とアクセスの為のプロパティ名が異なったりするので)。
offsetの場合、_STを追記します。例えば_MainTexの場合、_MainTex_STでtilingとoffsetにアクセスします。
最近はSetVectorArray等々で配列とかも渡せるようになりました。
Batchesを増やさない為には
ただ、完全に同一ではない設定の場合は、Batchesが増えます。例えば下のように同一テクスチャですがoffset等が異なるため、Batchesが増えます。
この場合、Spriteのようにメッシュ側のUVを変更してやれば、SetPassの数は抑えられます。ただしメッシュが増えるので、そこは色々と要相談で。
ということで、MaterialPropertyBlockとMeshのUV変更を上手く活用すると、SetPass1で描画出来るというお話。