- Home /
Question by
CalvinGames · May 20, 2017 at 09:21 AM ·
renderingshadersgraphicscolor
MaterialPropertyBlock works with DrawMesh but not DrawMeshInstanced.
I have a game that can have up to 10,000 instances of a certain object on a mobile device, so using DrawMeshInstanced instead of DrawMesh is important to keep framerates from declining. I'm using Materialpropertyblocks to change the color of meshes. This code draws meshes properly with correct colors using DrawMesh:
foreach (Object o in Objects) {
Block.SetColor ("_Color", Colors [o.Type]);
Graphics.DrawMesh (Meshes [Shapes [o.Type]], Matrix4x4.TRS (o.Position, o.Rotation, o.Scale), Mat, 0, MainCamera, 0, Block, UnityEngine.Rendering.ShadowCastingMode.Off, false);
}
But when I replace it with this:
List<Matrix4x4>[] ObjectInstances = new List<Matrix4x4>[Shapes.Count];
for (int i = 0; i < Shapes.Count; i++)
ObjectInstances [i] = new List<Matrix4x4> (1023);
foreach (Object o in Objects) {
if (ObjectInstances [o.Type].Count > 1022) {
Block.SetColor ("_Color", Colors[o.Type]);
Graphics.DrawMeshInstanced (Meshes [Shapes [o.Type]], 0, Mat, ObjectInstances [o.Type], Block);
ObjectInstances [o.Type].Clear ();
}
ObjectInstances [o.Type].Add (Matrix4x4.TRS (o.Position, o.Rotation, o.Scale));
}
for (int i = 0; i < Shapes.Count; i++) {
Block.SetColor ("_Color", Colors[i]);
Graphics.DrawMeshInstanced (Meshes [Shapes [i]], 0, Mat, ObjectInstances [i], Block);
}
All of the meshes are drawn properly as well, except the colors are all only the default color.
How can I use MaterialPropertyBlocks to change the colors of meshes drawn by DrawMeshInstanced? Would it be better to use DrawMeshInstancedIndirect?
Comment