La respuesta simple es cambiarlos entre cada llamada de sorteo. Establece un sombreador, dibuja una tetera, configura otro sombreador, dibuja otra tetera.
Para cosas más complejas donde necesita aplicar múltiples sombreadores a un solo objeto, como desenfoque, brillo, etc. Básicamente tienes todo renderizado a textura (s). Luego renderizas un quad sobre toda tu pantalla con esa textura aplicada mientras usas otro sombreador.
Por ejemplo, si desea renderizar un efecto de brillo, primero debe renderizar su escena no brillante normal, luego renderizar solo la silueta de color de las cosas que desea que brillen en una textura y luego cambiar a un sombreador borroso y renderizar su quad con esa textura unida sobre tu escena no brillante.
Existe otra técnica llamada sombreado diferido en la que renderiza la escena sin iluminación y la aplica más tarde en el espacio de la pantalla. El objetivo principal es reducir el gasto de iluminación por píxel.
Normalmente representa un búfer de color que se coloca en la pantalla. Con el sombreado diferido, en cambio, renderiza un búfer de color, así como un búfer normal y de profundidad en una pasada de sombreador (puede almacenar los vectores normales y la profundidad en una textura como con el mapeo normal y de altura).
Esto significa que, para cada píxel, conoce la posición de la pieza de geometría no transparente más cercana (profundidad o distancia del ojo), el color y la normalidad. Debido a esto, puede aplicar iluminación a cada píxel en la pantalla en lugar de a cada píxel visible de cada objeto que renderice. Recuerde que algún objeto se dibujará sobre la parte superior de otros objetos si la escena no se representa perfectamente en orden inverso.
Para las sombras, en realidad solo representa el búfer de profundidad desde el punto de vista de su luz y luego usa esa información de profundidad para determinar dónde incide la luz. Eso se llama mapeo de sombras (también hay otro enfoque llamado volúmenes de sombras que resuelve una silueta de la geometría y la extruye, pero aún usará sombreadores).
Con OpenGL más moderno (3.0+), usa un objeto Framebuffer con objetos Renderbuffers adjuntos. Dado que los renderbuffers se pueden tratar como una textura. Puede hacer cosas como hacer que 1 sombreador renderice en múltiples renderbuffers diferentes (para que no tenga que renderizar su textura, luego sus normales y luego los componentes de brillo), pero la práctica subyacente sigue siendo la misma.
También es deseable minimizar la cantidad de interruptores de sombreado tanto como sea posible para ahorrar en gastos generales. Por lo tanto, algunos motores agruparán todo con el mismo material para que se pueda dibujar a la vez.