When it comes to pre-sorting the draw calls for a given frame, I am aware of two different methods for optimising.
The first is to batch draw calls by their material. This minimises shader changes and limits the number of times constant buffers, textures, and other data need to be switched or updated also. Furthermore, this approach leads to easy multithreaded commandlist generation (important in the coming era of DX12 and Vulkan!), each thread can build a list of draw calls for each material independently.
However, one major source of framerate slowdown is 'overdraw'- i.e. drawing partially or fully obscured geometry BEFORE drawing the geometry that obscures it. When drawing roughly front-to-back the fragment shader has to do far less work because obscured pixels can be depth culled.
However, in order to sort geometry front-to-back, it is not really possible or practical to also try and sort draw calls by material (or is it?). Therefore, I ask, which of the two approaches is the 'better' (in terms of performance or general adoption); or is there a third or hybrid approach I am unaware of?