Dessiner des objets géométriques

 

Pour rappel, les primitives supportées sous OpenGL sont les points, lignes, polygones, triangles, ...

 

Vertex Array

Pour dessiner des objets géométriques, une solution consiste à passer les vertice, mais aussi les couleurs, coordonnées du brouillard, ... via un ou des tableaux à la carte graphique.

L'avantage de cette solution étant de fournir un plus grand nombre d'informations en un minimum d'appel.

  • Mais pour pouvoir utiliser ces tableaux, il faudra d'abord activer (puis désactiver) OpenGL pour qu'il utilise les dits tableaux.

    C'est le rôle de static void glEnableVertexAttribArray(int index) dans la classe GLES20

    En entrée:

    index correspond à l'index d'un attribut du vertex shader qui traitera le tableau.

     

    La fonction void GLES20.glDisableVertexAttribArray(int index); désactivera OpenGL pour l'utilisation du tableau par l'attribut d'index index.

     

  • Ensuite, il faut indiquer à OpenGL où se trouve les tableaux

    static void glVertexAttribPointer(int index, int size, int type, boolean normalized, int stride, Buffer ptr) toujours dans la classe GLES20

    En entrée:

    index correspond à l'index d'un attribut du vertex shader qui traitera le tableau.

    size: correspond aux nombres d'éléments composant un vertex (3 pour les éléments x, y et z), ...

    type: type utilisé par les éléments (exemple GLES20.GL_FLOAT pour indiquer un élément de type float

    normalized: demander ou non à normaliser les données (true ou false)

    stride: taille qu'occuppe effectivement un vertex, ... Par exemple si les coordonnées d'un vertex sont composées de x, y et z qui sont de type float, stride sera 3 * 4 octets (un float occupant 4 octets)

    ptr: pointeur sur le tableau.

     

Il ne reste plus qu'à demander à dessiner le tableau:

public static void glDrawArrays (int mode, int first, int count);

En entrée:

mode: primitives supportées sous OpenGL sont les points, lignes, polygones, triangles, ...

first: Indique l'index de départ à utiliser dans les tableaux activés.

count: le nombre de vertice à traiter.

 

Exemple de code

En reprenant les exemples de codes pour Shader, FactoryShader, ProgramGLSL et sa Factory, les codes suivants vont permettre de dessiner un rectangle à l'écran !!!

De plus, les 3 fichiers .xml sont identiques à ceux déjà créés pour initialiser OpenGL...

Un MainActivity:

Dont les explications seront identiques au chapitre initialiser OpenGL.

La seule différence sera l'utilisation d'une classe MonGLSurfaceView qui n'a rien d'extraordinaire, et qui étend GLSurfaceView:

Et le renderer associé à MonGLSurfaceView

Dedans seront programmés les shaders et la compilations de ceux-ci.

Et enfin, le plus important par rapport aux explications données ici, une esquisse de classe pour dessiner un objet géométrique, ici un triangle:

Dedans sera paramétré le shader vertex et le partage d'une zone mémoire en JAVA et OpenGL tel que déjà expliqué ici.

Ouah, c'est beau !

Image non trouvée !

Bon, ok, il y a mieux !

 

Annexe

Il s'agit ici d'une première solution pour dessiner des objets graphiques. Il en existe une seconde utilisant la technique des buffers object, vu plus tard. Il faut d'abord voir comment appliquer des couleurs aux vertice...