Le vertex shader sous Android
Le vertex shader permet de modifier la position, la couleur et l'éclairage d'un vertex. Un processus sera donc lancé sur un vertex et autant de processus qu'il y a de vertice.
Ce shader recevra des variables de type "Attribute variables".
Quelques attributs standards
Le minimum que doit faire ce vertex est de définir gl_position (disponible en lecture et écriture) qui va contenir les positions du vertex:
Et un minimum de code qui serait nécessaire pour exécuter ce shader:
[...] // Le code sera placé dans la méthode onDrawFrame(GL10 gl10) de votre instance de Renderer.
// Effacer le buffer en la remplissant avec la couleur définie par glClearColor() que l'on trouvera par exemple dans onSurfaceCreated du renderer GLES20.glClear(GL_COLOR_BUFFER_BIT);
// Indiquer l'instance du programme GLSL à utiliser (il aura été
préalablement compilé, linké
avec un fragment shader et validé)
GLES20.glUseProgram(mProgram);
// Indiquer le type d'opération graphique à effectuer, ici dessiner
un point
GLES20.glDrawArrays(GLES20.GL_POINTS, 0, vertexCount); Voir glDrawArrays
[...] // suite du code dépendant entre autre du framework utilisé
Pour permettre
de visualiser le point à l'écran, glPointSize est utilisé
afin de définir une taille à ce point.
Les coordonnées d'un vertex peuvent varier en x, y et en z entre [-1, 1] et [0,0, 0] et le crentre d'un repère orthonormé.
Pour ceux qui connaissent OpenGL, la variable gl_VertexID n'existe pas sous OpenGL SE 2.0...
Attributs personnalisés
Dans les shaders vertex, les attributs personnalisés sont numérotés à partir de 0. Il possible de définir vos propres attributs en les nommant, ce qui rendra le code plus simple à lire.
Pour cela, utilisez la fonction OpenGL glBindAttribLocation()
GLES20.glBindAttribLocation(mProgram, 0, "vPosition"); // Avec mProgram, le n° ou l'instance de votre programme
Puis affectez les valeurs dans l'attribut 0. Vous utiliserez le nom vPosition dans le shader...
GLES20.glVertexAttrib4f(int indx, float x, float y, float z, float w)
Avec indx qui est l'index de l'attribut, x, y et z les coordonnées de type float (cf. vec4).
Par exemple:
GLES20.glVertexAttrib4f(0, x, 0, 0, 1); // Avec x qui varie entre -1 et 1, vous
obtenez votre première animation !
A partir
d'OpenGL 3.3, il est possible d'indiquer la localisation d'un attribut via la
directive de compilation layout. Mais cette solution n'existe pas pour OpenGL
ES.
Définir la taille d'un point
En mathématique, les professeurs n'ont eu de cesse de vous apprendre qu'un point n'a pas de taille...
Si vous désirez dessiner un point à l'écran, il sera judicieux de lui définir une taille (sic !). Sinon, vous ne verrez pas grand chose à l'écran.
La variable gl_PointSize permet d'indiquer cette taille (disponible en lecture et écriture):
gl_PointSize = 40.0;