Vor dem gleichen Problem habe ich vor kurzem auch gestanden und gegrübelt. Ein ganz einfacher Tipp den ich für dich hätte: Geh nochmal durch was du eigentlich machen willst, und dann schau wie viele Shader du tatsächlich nur brauchst! Ich habe bei mir ganz einfach eine Pipeline Klasse, welche, wie der Name schon sagt, die Pipeline durch eine neue erstezt. Diese kann 1 oder mehrere Programme beinhalten. Ich habe nun eine Pipeline fürs Wasser, eine für Animierte Modelle, eine für Statische Modelle, und eine für das Terrain. Die Wasser-Pipeline kann man über das Device setzen und auch verschiedene Techniken auswählen, beispielsweise Refractionmap erzeugen, Reflactionmap ...
Wenn da mal ein Modell gezeichnet wird, das grad keine Specularmap benutzt, ist das auch nicht so tragisch.
Im prinziep ist es ähnlich dem Effect-Framework von DX, nur etwas einfacher und für OpenGL
Bei mir funktioniert das ganze recht gut und im chaos hat das auch noch nicht geendet.