maybe you’ll find this useful:
a good technique ist to store materials in buffer object and reference them, use bindless textures, and merge as many draw calls as possible, make use of indirect rendering and sort everything after renderstates, so that you only have to set 1 renderstate once (pre frame).