Dois-je relier les uniformes ou les attributs lors du changement de programme de shader?


11

Le rendu de la scène implique généralement plusieurs programmes de shaders qui, dans mon cas, utilisent tous les mêmes attributs et partagent au moins certains des uniformes. Pour les faire fonctionner correctement, je joue actuellement en toute sécurité, ce qui signifie que je lie les attributs et que j'obtiens les emplacements uniformes appropriés chaque fois que je passe d'un programme de shader à l'autre. Donc, fondamentalement, plusieurs fois dans chaque image, ce qui n'est probablement pas la meilleure approche.

Alors, est-il (en général) nécessaire de relier les attributs et les uniformes après avoir changé de programme de shader? Et pourquoi?

Dans l'affirmative, existe-t-il un moyen de le faire une fois au début du programme et de ne plus jamais avoir à les toucher (sauf pour définir les valeurs uniformes)?

Réponses:


12

Vous n'avez pas besoin de relier les attributs, tant que vous vous assurez que leur emplacement reste le même dans les deux shaders. (Habituellement, en utilisant la layout(location = X)syntaxe dans GLSL, mais peut également être fait avec glBindAttribLocationsi l'ancien n'est pas disponible.)

Les uniformes, cependant, font partie de l'état de l'objet Shader, et devront donc être définis au moins une fois pour chaque shader. Une façon de minimiser le coût de ceci est d'utiliser un objet tampon uniforme , qui contiendra toutes vos valeurs uniformes et peut ensuite être lié à un shader avec un seul appel.


Sur votre lien UBO: "Enfin, ils peuvent être utilisés pour partager des informations entre différents programmes. Ainsi, la modification d'un seul tampon peut effectivement mettre à jour les uniformes de plusieurs programmes."
Zouch
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.