I have created a custom shader in shadergraph. It has many different values which can be changed. I want to use the shader to have different values on different static gameobjects (Walls, floors etc). For example one wall will be red and another blue. I see two ways to do that: 1: Make two different materials. Assign the same shader on both. Then change the shader settings in each material. OR 2: Create a single material. Asign the shader to it. Assign the same material to both walls. Then use the following editor code: Code (CSharp): Renderer renderer = Selection.activeGameObject.GetComponent<MeshRenderer>(); Material mat = renderer.sharedMaterial; renderer.sharedMaterial = new Material(mat); I want to know which way will be better for performance. Method 1 has different materials so I wont be able to use any performance optimization techniques (Like draw call batching or GPU instancing) But perhaps I can use the SRP batching for this ? Method 2 uses the same material everywhere so I guess it would be possible to use Draw call batching or GPU instancing. I am unsure what exactly am I doing with shared materials... Am I creating a shader or material instance ? If it is Shader instance then perhaps I can use SRP Batching ? I would really appreciate your help wit this.