web-dev-qa-db-fra.com

OpenGL ES 2.0 Plusieurs programmes ou plusieurs shaders ou quoi? Comment ça marche?

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 plusieurs shaders; ou s'il est même conseillé/attendu qu'une personne le fasse.

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

Qu'est-ce que j'ai fait

J'ai donc écrit un programme de base OpenGL ES 2.0 pour mon Android jeu qui fonctionne parfaitement car il peut dessiner le contour des objets à l'écran. Mais il ne fait rien d'autre; à peu près parce que le 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 assez basiques. La raison pour laquelle je ne suis pas allé plus loin est parce que je ne peux pas savoir si je suis censé écrire un 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 procéder de manière efficace?

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

J'ai:

  • Regardé plusieurs tutoriels; aucun d'entre eux n'utilise autre chose que les shaders les plus basiques.
  • Lisez l'intégralité de la spécification OpenGL ES 2.0 GLSL (aucune ne mentionnant comment elle était destinée à être utilisée; il s'agissait à peu près de ce que tout faisait plutôt que de la façon dont il s'emboîtait).
  • J'ai essayé de modifier un peu mes shaders.

J'espère donc que je suis près de comprendre le flux de travail OpenGL mais je ne semble pas être encore là.

Edit: j'ai trouvé ça bien après:

Si votre application est écrite pour OpenGL ES 2.0, ne créez pas un shader unique avec de nombreux commutateurs et conditions qui exécute toutes les tâches dont votre application a besoin pour rendre la scène. Au lieu de cela, compilez plusieurs programmes de shaders qui effectuent chacun une tâche spécifique et ciblée.

Cela vient des iOS OpenGL ES 2.0 guidelines.

55
Robert Massaioli

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

21
Jave