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.