Muss ich Uniformen oder Attribute neu binden, wenn ich Shader-Programme ändere?

11

Das Rendern der Szene umfasst normalerweise mehr als ein Shader-Programm, das in meinem Fall alle dieselben Attribute verwenden und zumindest einige der Uniformen gemeinsam nutzen. Damit sie richtig funktionieren, gehe ich derzeit auf Nummer sicher, dh ich binde die Attribute neu und erhalte bei jedem Wechsel zwischen Shader-Programmen die entsprechenden einheitlichen Speicherorte. Also im Grunde mehrmals in jedem Frame, was wahrscheinlich nicht der beste Ansatz ist.

Ist es also (im Allgemeinen) notwendig, Attribute und Uniformen nach dem Wechsel von Shader-Programmen neu zu binden? Und warum?

Wenn ja, gibt es eine Möglichkeit, dies einmal zu Beginn des Programms zu tun und sie nie wieder berühren zu müssen (außer zum Einstellen der einheitlichen Werte)?

Nero
quelle

Antworten:

12

Sie müssen die Attribute nicht erneut binden, solange Sie sicherstellen, dass ihre Position in beiden Shadern gleich bleibt. (Verwendet normalerweise die layout(location = X)Syntax in GLSL, kann aber auch verwendet werden, glBindAttribLocationwenn erstere nicht verfügbar ist.)

Uniformen sind jedoch Teil des Shader-Objektstatus und müssen daher für jeden Shader mindestens einmal festgelegt werden. Eine Möglichkeit, die Kosten hierfür zu minimieren, besteht darin, ein einheitliches Pufferobjekt zu verwenden , das alle Ihre einheitlichen Werte enthält und dann mit einem einzigen Aufruf an einen Shader gebunden werden kann.

Yuriks
quelle
Auf Ihrem UBO-Link: "Schließlich können sie verwendet werden, um Informationen zwischen verschiedenen Programmen auszutauschen. Durch Ändern eines einzelnen Puffers können Uniformen in mehreren Programmen effektiv aktualisiert werden."
Zouch