Unity default UI shader use [PerRendererData] for Sprite Texture, so you can use one shader for all your sprite and render them in one draw call. But I can't seem to find a API call for setting those anywhere, so I decompile Unity dll just to find that they use an Internal call to set the sprite. On the asset store I see a lot of package about normal mapped UI, so there must be a way to pass in per renderer data to the Canvas Renderer, right?
Also struggling with this. The only solution I found so far is cloning the materials on runtime, which creates more drawcalls in the end. Code (CSharp): Material instancedMat; ... instancedMat = Instantiate(image.material); image.material = instancedMat; Also took a look at the decompiled unity version, but didn't get any smarter. I fear as for now (5.6), there is no solution to this problem.