AOIちゃんMモデルをマテリアル1にするのに成功したので、Shaderで髪と目の色を指定できるようにしました。
目と髪が別々に色指定可能ですが、メッシュが1つなので、髪と目がそれぞれ5色だと、25個のマテリアルを作る必要があります。
別々なら10個で済むのでギリOKですが、25個はさすがに面倒なので、スクリプトで実行時に作ってみたい。
まずは単独のマテリアルで100体表示した例。地面と文字でSetPassCall2なので、人体で+1しか増えないで3となっている。
マテリアルを二つ用意して、切り替えた場合、SetPassCallが6~7となり、一つの場合と比べて、3~4増えている。
よくわからない増え方。
次は、あらかじめ作っておくのではなく、スクリプトでMaterialをnewして二つ目を追加した場合。
何も考えずに100体のマテリアルを書き換えると、SetPassCallは100を超えます。
100体すべてでインスタンス化されるせいで、三色使うなら、三色分のマテリアルを保存しておいて、同じ色を使うなら、使いまわす必要があります。
上記と同じくらいだが、微妙に違う気もする。
一つ目のマテリアルは元々の奴。次は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ぐらい増えるのかな?
参考