J'essaie d'apprendre OpenGL ES 2.0 et je me demande quelle est la pratique la plus courante pour "gérer" les shaders.
Je pose cette question parce que dans les exemples que j'ai trouvés (comme celui inclus dans la démonstration de l'API fournie avec le sdk android), je vois généralement tout dans la classe GLRenderer et je préfère séparer les choses pour que je puisse les avoir, par exemple, un objet GLImage que je peux réutiliser chaque fois que je veux dessiner un quad texturé (je me concentre uniquement sur la 2D pour le moment), tout comme je l'avais fait dans mon code OpenGL ES 1.0. Dans presque tous les exemples que j'ai trouvés, les shaders sont simplement définis comme des attributs de classe. Par exemple:
public class Square {
public final String vertexShader =
"uniform mat4 uMVPMatrix;\n" +
"attribute vec4 aPosition;\n" +
"attribute vec4 aColor;\n" +
"varying vec4 vColor;\n" +
"void main() {\n" +
" gl_Position = uMVPMatrix * aPosition;\n" +
" vColor = aColor;\n" +
"}\n";
public final String fragmentShader =
"precision mediump float;\n" +
"varying vec4 vColor;\n" +
"void main() {\n" +
" gl_FragColor = vColor;\n" +
"}\n";
// ...
}
Je m'excuse à l'avance si certaines de ces questions sont stupides, mais je n'ai jamais travaillé avec des shaders auparavant.
1) Le code ci-dessus est-il le moyen commun de définir les shaders (propriétés de classe finale publique)?
2) Dois-je avoir une classe Shader séparée?
3) Si les shaders sont définis en dehors de la classe qui les utilise, comment pourrais-je connaître les noms de leurs attributs (par exemple "aColor" dans le morceau de code suivant) pour pouvoir les lier?
colorHandle = GLES20.glGetAttribLocation(program, "aColor");
la source
La gestion des shaders (et donc du matériel) est un problème assez délicat que vous rencontrez lorsque votre système graphique devient plus complexe et que vous remarquez qu'un codage dur chaque shader entraînerait une duplication de code massive. Voici quelques façons alternatives de le résoudre:
En ce qui concerne les noms d'attribut et uniformes et autres, vous utilisez simplement une dénomination cohérente dans tous les shaders.
la source