Die einfache Antwort ist, dass Sie sie zwischen jedem Draw-Aufruf ändern. Setze einen Shader, zeichne eine Teekanne, setze einen anderen Shader, zeichne eine andere Teekanne.
Für komplexere Aufgaben, bei denen Sie mehrere Shader auf nur ein Objekt anwenden müssen, z. B. Weichzeichnen, Glühen usw. Sie haben im Grunde alles auf Textur (en) gerendert. Dann rendern Sie ein Quad mit dieser Textur über den gesamten Bildschirm, während Sie einen anderen Shader verwenden.
Wenn Sie beispielsweise einen Glüheffekt rendern möchten, müssen Sie zuerst Ihre normale, nicht glühende Szene rendern und dann nur die farbige Silhouette des Materials rendern, das Sie auf einer Textur glühen möchten. Dann wechseln Sie zu einem Unschärfenshader und rendern Ihre Quad mit dieser Textur über Ihrer nicht leuchtenden Szene.
Es gibt eine andere Technik namens " Verschobene Schattierung", bei der Sie die Szene ohne Beleuchtung rendern und später im Bildschirmbereich anwenden. Das Hauptziel ist es, die Kosten für die Beleuchtung pro Pixel zu senken.
Normalerweise rendern Sie einen Farbpuffer, der auf dem Bildschirm angezeigt wird. Bei verzögerter Schattierung rendern Sie stattdessen einen Farbpuffer sowie einen Normal- und einen Tiefenpuffer in einem Shader-Durchgang (Sie können die normalen Vektoren und die Tiefe in einer Textur wie bei der Normal- und Höhenzuordnung speichern).
Dies bedeutet, dass Sie für jedes Pixel die Position des nächsten Teils der nicht transparenten Geometrie (Tiefe oder Abstand vom Auge), die Farbe und die Normale kennen. Aus diesem Grund können Sie die Beleuchtung auf jedes Pixel auf dem Bildschirm anwenden, anstatt auf jedes sichtbare Pixel jedes Objekts, das Sie rendern. Denken Sie daran, dass ein Objekt über andere Objekte gezogen wird, wenn die Szene nicht in der Reihenfolge von vorne nach hinten perfekt gerendert ist.
Für Schatten rendern Sie tatsächlich nur den Tiefenpuffer aus der Sicht Ihres Lichts und verwenden dann diese Tiefeninformationen, um herauszufinden, wo das Licht einfällt. Das nennt man Shadow Mapping (es gibt auch einen anderen Ansatz namens Shadow Volumes, bei dem eine Silhouette der Geometrie berechnet und extrudiert wird, Sie werden jedoch weiterhin Shader verwenden.).
Mit modernerem OpenGL (3.0+) verwenden Sie ein Framebuffer-Objekt mit angehängten Renderbuffers-Objekten. Da Renderbuffer wie eine Textur behandelt werden können. Sie können beispielsweise 1 Shader-Rendering auf mehrere verschiedene Renderbuffer anwenden (Sie müssen also nicht Ihre Textur und dann Ihre Normalen und dann die Glühkomponenten rendern ), aber die zugrunde liegende Vorgehensweise ist immer noch dieselbe.
Es ist auch wünschenswert, die Anzahl der Shader-Switches so gering wie möglich zu halten, um Overhead zu sparen. Einige Motoren gruppieren also alles mit demselben Material, sodass alle gleichzeitig gezeichnet werden können.