Je voudrais avoir deux pixel shaders; le premier fait une chose, et ensuite le suivant fait autre chose. Est-ce possible, ou est-ce que je dois tout emballer dans le même shader?Pouvez-vous avoir plusieurs pixels (fragments) dans le même programme?
Répondre
Vous pouvez le faire, par ex. en effectuant des appels de fonction de l'entrypoint principal vers des fonctions qui sont implémentées dans les différents objets de shader.
main() {
callToShaderObject1()
callToShaderObject2()
}
chacune de ces fonctions callToShaderObject peut vivre dans différents objets de shaders, mais tous les objets doivent être attachés et liés dans le même programme avant qu'il ne puisse être utilisé.
Ils ne peuvent pas s'exécuter en même temps, mais vous pouvez utiliser différents shaders pour différentes géométries ou effectuer plusieurs passes en utilisant différents shaders.
Est-ce que cela nécessiterait un programme différent? Donc un programme différent pour chaque passe? Comme dans, je pourrais avoir un vertex et fragment shader sur un programme (qui est un passage?) Et avoir alors un vertex et fragment shader sur un autre programme (le second passage?)? Puis-je simplement changer glUseProgram() quand j'en ai envie? Donc, je suis essentiellement en train de rendre une scène deux fois ...? – Harry
Exactement raison. Tout comme un rendu multi-passes dans un pipeline fixe, mais au lieu de changer les paramètres openGL entre les passages, vous chargez différents programmes. –
Hors de la curiosité, pourquoi le feriez-vous, par opposition à simplement avoir toutes les fonctions dans le fragment shader en question? Est-ce pour que le code puisse être partagé avec d'autres programmes de shaders, sans nécessiter de duplication? –
@Nick: Je ne l'ai pas vu utilisé moi-même. J'ai été surpris quand j'ai lu la spécification à l'idée de construire des programmes de shader à partir d'objets shader - d'où la raison pour laquelle je sais que vous pouvez le faire. Il a été construit à partir du modèle de compilation standard ... – Bahbar
Mise à jour: J'ai vu cela en cours maintenant, tout en étudiant les shaders MineCraft modded. Dans ce cas, il était très utile car chaque shader a beaucoup d'options qui peuvent être activées et désactivées, avec divers effets fonctionnant en conjonction avec d'autres. Dans un scénario comme celui-là, et où plusieurs auteurs sont impliqués, il devient beaucoup plus utile de séparer les fonctions en fichiers séparés. –