La réponse est simple: vous les changez entre chaque appel de tirage. Définissez un shader, dessinez une théière, définissez un autre shader, dessinez une autre théière.
Pour des tâches plus complexes où vous devez appliquer plusieurs shaders à un seul objet, tel que le flou, la lueur, etc. Vous avez essentiellement tout rendu en texture (s). Ensuite, vous rendez un quad sur tout votre écran avec cette texture appliquée tout en utilisant un autre shader.
Par exemple, si vous souhaitez créer un effet de rayonnement, vous devez d'abord rendre votre scène normale, puis ne restituer que la silhouette colorée du contenu que vous souhaitez appliquer à une texture, puis basculer vers un arrière-plan flou et restituer votre rendu. quad avec cette texture attachée sur votre scène non-rougeoyante.
Il existe une autre technique appelée Ombrage différé, qui consiste à rendre la scène sans éclairage et à l'appliquer ultérieurement dans l'espace écran. L'objectif principal est de réduire les dépenses d'éclairage par pixel.
Normalement, vous rendez un tampon de couleur qui est affiché à l'écran. Avec l'ombrage différé, vous créez à la place un tampon de couleur, ainsi qu'un tampon de profondeur et de normales dans une passe de shader (vous pouvez stocker les vecteurs normaux et la profondeur dans une texture, comme avec les mappages de hauteur et de normale).
Cela signifie que, pour chaque pixel, vous connaissez la position de la partie la plus proche de la géométrie non transparente (profondeur ou distance de l'œil), la couleur et la normale. De ce fait, vous pouvez appliquer un éclairage à chaque pixel de l'écran plutôt qu'à chaque pixel visible de chaque objet que vous rendez. N'oubliez pas que certains objets seront dessinés au-dessus d'autres objets si la scène n'est pas parfaitement restituée dans l'ordre inverse.
Pour les ombres, vous ne restituez que le tampon de profondeur du point de vue de votre lumière, puis utilisez ces informations de profondeur pour déterminer l’endroit où la lumière s’éclaire. Cela s'appelle le mappage des ombres (il existe également une autre approche appelée volumes des ombres qui élabore une silhouette de la géométrie et l’extrude, mais vous utiliserez toujours des ombreurs.).
Avec OpenGL (3.0+) plus moderne, vous utilisez un objet Framebuffer auquel sont attachés des objets Renderbuffers. Depuis les renderbuffers peuvent être traités comme une texture. Vous pouvez faire des choses comme avoir un rendu de shader à plusieurs rendus différents (de sorte que vous n’ayez pas à rendre votre texture à vos normales puis aux composants de lueur) mais la pratique sous-jacente reste la même.
Il est également souhaitable de minimiser autant que possible le nombre de commutateurs de shader pour économiser sur les frais généraux. Ainsi, certains moteurs regrouperont tout avec le même matériau afin que tout puisse être dessiné en même temps.