mixed-reality-extension-sdk
mixed-reality-extension-sdk copied to clipboard
GPU Perf: minimize drawcalls from identical materials with different colors.
It's a common pattern to have the same material duplicated with different colors - grayMaterial, blueMaterial, greenMaterial etc. However, these require one unique drawcalls per material even if the mesh is otherwise unchanged. A better model may be to move the color property to be a mesh instance property - identical meshes in different colors would automatically collapse into a single drawcall
Counterpoint: if the meshes have different color properties, they're not identical, so it would break batching anyway. That's sort of the point of GPU instancing, they have to be totally identical in render properties except for the transform, otherwise they can't be drawn all at once. Think of it like a rubber stamp: if you want ten "OK" stamps it's as easy to stamp ten times as once. But if they're even slightly different, you have to do extra work in between stampings, even if it's just loading up a different ink.
Reusing materials is still better than not, even without GPU instancing though. If color is the only variation, then reuse a material with a white color, and use mesh vertex colors for the tint. That's the same amount of work for the GPU, and is possible with the current state of the SDK.
Alternatively, perhaps host apps could use Unity's MaterialPropertyBlock on the color property? Though without SDK modifications, they would have to dynamically merge and reuse materials that are identical except for that property, which is a significant complexity increase.