読者です 読者をやめる 読者になる 読者になる

テラシュールブログ

旧テラシュールウェアブログUnity記事。主にUnityのTipsやAR・VR、ニコニコ動画についてのメモを残します。

【Unity】マテリアルやSetPassを増やさずテクスチャのUVを変える

2D Unity 最適化・デバッグ

色やテクスチャを変えるとマテリアルが増える

UnityはGetComponent<Renderer>().material.color = 色;とかでマテリアルの色を変更する事が出来ますが、これを行うとマテリアルが追加で一つ作られます。

異なるマテリアルは一括で描画出来ないので、内容物が同じであっても別々のレンダリングパスで描画される事になります。そうなるとSetPassが増え、またMaterialも別物として生成されるので消費メモリも僅かに(数kbytesくらい)増えます。

f:id:tsubaki_t1:20160605230303j:plain

もしコレが、マテリアルの設定が「同一・もしくは僅かに異なる」ようなケースの場合、MaterialPropertyBlockを使うと多少効率的に描画出来、またマテリアルも増やさないように出来ます。

f:id:tsubaki_t1:20160605230621j:plain

MaterialPropertyBlockを使用する

MaterialPropertyBlockを使用する場合は、MaterialPropertyBlockを生成し、そこにマテリアルの情報を流し込み、それをレンダラーに渡すだけです。

f:id:tsubaki_t1:20160605232355j:plain

テクスチャや色といった情報は、シェーダーに渡します。渡せるシェーダー情報はEdit ShaderのPropertiesで調べる感じです(表記名とアクセスの為のプロパティ名が異なったりするので)。
offsetの場合、_STを追記します。例えば_MainTexの場合、_MainTex_STでtilingとoffsetにアクセスします。

最近はSetVectorArray等々で配列とかも渡せるようになりました。

f:id:tsubaki_t1:20160605232832g:plain

Batchesを増やさない為には

ただ、完全に同一ではない設定の場合は、Batchesが増えます。例えば下のように同一テクスチャですがoffset等が異なるため、Batchesが増えます。

f:id:tsubaki_t1:20160605233423j:plain

この場合、Spriteのようにメッシュ側のUVを変更してやれば、SetPassの数は抑えられます。ただしメッシュが増えるので、そこは色々と要相談で。

f:id:tsubaki_t1:20160606000439j:plain

f:id:tsubaki_t1:20160606021447j:plain

ということで、MaterialPropertyBlockとMeshのUV変更を上手く活用すると、SetPass1で描画出来るというお話。

関連

tsubakit1.hateblo.jp

answers.unity3d.com