La semplice risposta è cambiarli tra una chiamata e l'altra. Imposta uno shader, disegna una teiera, imposta un altro shader, disegna un'altra teiera.
Per cose più complesse in cui è necessario applicare più shader a un solo oggetto come sfocatura, luminosità e così via. Fondamentalmente hai tutto il rendering in trama (s). Quindi esegui il rendering di un quad su tutto lo schermo con quella trama applicata mentre usi un altro shader.
Ad esempio, se vuoi renderizzare un effetto bagliore, devi prima renderizzare la tua normale scena non luminosa, quindi renderizzare solo la sagoma colorata delle cose che vuoi illuminare su una trama, quindi passa a uno shader di sfocatura e rendi il tuo quadruplo con quella trama attaccata sulla scena non luminosa.
Esiste un'altra tecnica chiamata ombreggiatura differita in cui si esegue il rendering della scena senza illuminazione e la si applica successivamente nello spazio dello schermo. L'obiettivo principale è ridurre il costo dell'illuminazione per pixel.
Normalmente si esegue il rendering di un buffer di colore che viene messo sullo schermo. Con l'ombreggiatura differita si esegue invece il rendering di un buffer di colore e di un buffer normale e di profondità in un passaggio shader (è possibile memorizzare i vettori normali e la profondità in una trama come con la mappatura normale e di altezza).
Ciò significa che, per ogni pixel, conosci la posizione del pezzo più vicino di geometria non trasparente (profondità o distanza dall'occhio) il colore e il normale. Per questo motivo puoi applicare l'illuminazione a ciascun pixel sullo schermo anziché a ciascun pixel visibile di ogni oggetto che visualizzi. Ricorda che alcuni oggetti verranno disegnati sopra gli altri oggetti se la scena non è resa perfettamente in ordine da davanti a dietro.
Per le ombre si esegue il rendering solo del buffer di profondità dal punto di vista della propria luce, quindi si utilizzano le informazioni di profondità per capire dove colpisce la luce. Si chiama shadow mapping (esiste anche un altro approccio chiamato volume shadow che elabora una sagoma della geometria e la espelle, ma continuerai a utilizzare gli shader).
Con OpenGL più moderno (3.0+) usi un oggetto Framebuffer con gli oggetti Renderbuffers collegati. Poiché i renderbuffer possono essere trattati come una trama. Potresti fare cose come avere un rendering shader su più renderbuffer diversi (quindi non devi rendere la tua trama quindi le tue normali quindi i componenti bagliore) ma la pratica sottostante è sempre la stessa.
Inoltre, è consigliabile ridurre al minimo il numero di interruttori shader per risparmiare sulle spese generali. Quindi alcuni motori raggrupperanno tutto con lo stesso materiale insieme in modo che possano essere disegnati tutti in una volta.