55 votes

OpenGL ES 2.0 Programmes multiples ou Shaders multiples ou quoi ? Comment cela fonctionne-t-il ?

Le problème (TL;DR)

Mon problème, fondamentalement, est que je ne sais pas comment OpenGL ES 2.0 s'attend à ce que j'écrive et utilise des shaders multiples ; ou s'il est même conseillé/attendu qu'une personne le fasse.

La question fondamentale est la suivante : si j'ai une pomme, une roche lumineuse et un maillage flou, tous dans le même monde 3D, tous dessinés avec des programmes de shaders différents mais utilisant la même mvpMatrix, comment puis-je les utiliser dans le même rendu OpenGL de sorte qu'ils utilisent tous les shaders les plus appropriés que j'ai écrits ?

Qu'ai-je fait ?

J'ai donc écrit un programme OpenGL ES 2.0 de base pour mon jeu Android qui fonctionne parfaitement dans la mesure où il peut dessiner le contour des objets à l'écran. Mais il ne fait rien d'autre ; à peu près parce que les shaders ressemblent à ceci :

Vertex Shader

uniform mat4 uMVPMatrix;
attribute vec4 aPosition;

void main() {
    gl_Position = uMVPMatrix * aPosition;
}

Fragment Shader

void main() {
    gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);
}

Maintenant, ils sont plutôt basiques. La raison pour laquelle je ne suis pas allé plus loin est que je n'arrive pas à comprendre si je suis censé écrire un seul shader à appliquer à tous mes différents objets ou si je suis censé utiliser plusieurs shaders. Et si je suis censé utiliser plusieurs shaders pour dessiner plusieurs objets différents, comment dois-je m'y prendre pour le faire de manière efficace ?

J'ai l'impression que cela doit être une connaissance de base pour quiconque utilise OpenGL ES 2.0 jour après jour. J'espère donc que quelqu'un pourra répondre à ma question ou m'indiquer la bonne direction.

Je l'ai fait :

  • J'ai regardé de nombreux tutoriels ; aucun n'utilise autre chose que les shaders les plus basiques.
  • Lisez l'intégralité de la spécification OpenGL ES 2.0 GLSL (dont aucune ne mentionne la manière dont elle est censée être utilisée ; il est juste question de ce que tout fait plutôt que de la manière dont cela s'intègre).
  • J'ai essayé de modifier un peu mes shaders.

J'espère donc que je suis sur le point de comprendre le flux de travail OpenGL, mais je ne semble pas encore y être.

Edit : J'ai trouvé ceci bien après :

Si votre application est écrite pour OpenGL ES 2.0, ne créez pas un seul shader avec beaucoup de commutateurs et de conditionnels qui exécute toutes les tâches dont votre application a besoin pour rendre la scène. Compilez plutôt plusieurs programmes de shaders qui effectuent chacun une tâche spécifique et ciblée.

Cela vient de la Directives iOS OpenGL ES 2.0.

21voto

Jave Points 14930

Vous pouvez utiliser plusieurs shaders, mais passer de l'un à l'autre peut être assez coûteux. La pratique recommandée est donc de dessiner tous les objets d'un shader, puis de passer au shader suivant et de dessiner tous les objets utilisant celui-ci et ainsi de suite.
Pour passer d'un shader à l'autre, vous appelez glUseProgram() .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X