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

AIプログラムとかUnityゲーム開発について

探索や学習などを活用したAI系ゲームを作りたいと思います。

Materialをスクリプトで実行時に作成してSetPassCall数を比較

Unity

AOIちゃんMモデルをマテリアル1にするのに成功したので、Shaderで髪と目の色を指定できるようにしました。

目と髪が別々に色指定可能ですが、メッシュが1つなので、髪と目がそれぞれ5色だと、25個のマテリアルを作る必要があります。
別々なら10個で済むのでギリOKですが、25個はさすがに面倒なので、スクリプトで実行時に作ってみたい。


まずは単独のマテリアルで100体表示した例。地面と文字でSetPassCall2なので、人体で+1しか増えないで3となっている。
f:id:yasu9780:20170306070146p:plain


マテリアルを二つ用意して、切り替えた場合、SetPassCallが6~7となり、一つの場合と比べて、3~4増えている。
よくわからない増え方。
f:id:yasu9780:20170306070153p:plain



次は、あらかじめ作っておくのではなく、スクリプトでMaterialをnewして二つ目を追加した場合。

何も考えずに100体のマテリアルを書き換えると、SetPassCallは100を超えます。
100体すべてでインスタンス化されるせいで、三色使うなら、三色分のマテリアルを保存しておいて、同じ色を使うなら、使いまわす必要があります。


上記と同じくらいだが、微妙に違う気もする。
f:id:yasu9780:20170306070157p:plain


一つ目のマテリアルは元々の奴。次はnewして赤色にしてmats[1]に保存。
マテリアルを書き換えた時点でnewされるって話もあるので、内部的にどうなっているかよくわからない。
このへんはDestroyした場合に、マテリアルインスタンスだけが残ってリークする可能性もあるらしい。

MeshRenderer r = ob.GetComponent<MeshRenderer>();
mats[0] = r.sharedMaterial;

Material m = new Material( r.material);
m.SetColor("_HairColor", new Color(1, 0, 0));
mats[1] = m;

複数の色の髪のテクスチャをアトラス化して一つにしてしまえば、複数色でマテリアル1が実現できるのかな?
ちょっとやり方が分からないけど。


5色にしたらSetPassCall 15で、初めの1色より13増えている。1色あたり3ぐらい増えるのかな?

f:id:yasu9780:20170306074034p:plain


参考

dnasoftwares.hatenablog.com