I have a fairly complex shader that handles any combination of per vertex and per fragment lights, reflections, shadows and bumps. Of course this means that there are a number of branches (if…) both in the vertex and fragment shaders that depend on the value of several uniforms, and their values do not change frequently (per object or in some cases only per frame).
My GPU handles dynamic branching and I do NOT have to support older and lower end cards.
But I can also make several simplified versions of the same shader (e.g. only vertex lighting, only fragment lighting, no shadows, no reflections, no bumps, etc.) that basically would remove several ifs from the shader and would let the CPU execute them with the end result of the necessary glUseProgram to be called (plus possibly a few extra uniforms to set because of switching shaders). In theory it would make sense because most of the objects in my scene probably do not need all the advanced rendering features to be switched on, or at least not at the same time.
My question is, of course: Is it worth the effort to make a dozen simplified shaders or is dynamic branching so good that the gain in performance would be negligible?