Skip to content
This repository has been archived by the owner on Jun 10, 2022. It is now read-only.

GPU Perf: minimize drawcalls from identical materials with different colors. #724

Open
sorenhan opened this issue Oct 2, 2020 · 1 comment

Comments

@sorenhan
Copy link
Contributor

sorenhan commented Oct 2, 2020

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

@stevenvergenz
Copy link
Contributor

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.

@sorenhan sorenhan changed the title GPU Perf: move material color to be a mesh property. GPU Perf: minimize drawcalls from identical materials with different colors. Oct 2, 2020
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants