I've got the graphics module of my engine running okay now for basic shader effects like textures and simple pixel shading. I want to extend it though, and add light pre-pass rendering, shadow maps, and post-processing. I also want to add a few instancing, tesselation, and geometry shader techniques, and maybe some SSAO later on. I've been looking around for examples of engine architectures that make this possible to add, but I haven't really found anything. What would the best way to add this be? Should I break up my simple architecture to allow custom passes to be added that derive from an interface class? For the tesselation and geometry shaders, is it possible to have some sort of geometry pass that gets run first and then that geometry would be operated on by the other rendering passes? And finally, how would special cases be able to be handled, like transparent objects, sky, and particles?