Jump to: navigation, search

Fast opengl shapes rendering

Cet article est dédié à l'optimisation du dessin de nombreux éléments graphiques en OpenGL. Si vous arrivez ici, c'est que vous rencontrez des problèmes de performances dans votre projet (typiquement un fps qui vous tombe dans les chaussettes).

Code

Vous devez avoir calculer au préalable les positions de tous les points à afficher. Typiquement, ils sont stockés dans un vector< ofVec3f >.

Dans l'exemple ci-dessous, mon vector contient la position d'une liste de points à rendre sous forme de GL_LINES (ref). Dans ce mode, la carte graphique s'attend à recevoir un nombre pair de points, qui seront interpétés par couple, chaque couple comprenant le début et la fin du segment. Je multiple donc par 2 le nombre de mes points, chaque point étant le début d'un segment mais aussi la fin d'un autre. Pour être précis, le premier et le dernier point de ma liste n'interviennent qu'une seule fois dans mon dessin.

// création d'un tableau de float reprenant toutes le coordonnées pour toutes les lignes
int numvertices = 2 * ( mesvertices.size() - 1 );
float * vertices = new float [ 3 * numvertices  ]; 
vector< ofVec3f >::iterator prev = mesvertices.begin();
int vid = 0;
// copie des ofVec3f dans le tableau de floats
for ( vector< ofVec3f >::iterator itv = mesvertices.begin(); itv != mesvertices.end(); ++itv ) {
    if ( itv != prev ) {
         vertices[ vid ] = (*prev).x;
         vid++;
         vertices[ vid ] = (*prev).y;
         vid++;
         vertices[ vid ] = (*prev).z;
         vid++;
         vertices[ vid ] = (*itv ).x;
         vid++;
         vertices[ vid ] = (*itv ).y;
         vid++;
         vertices[ vid ] = (*itv ).z;
         vid++;
    }
    prev  = itv;
}
glEnableClientState ( GL_VERTEX_ARRAY ); //active l'utilisation des vertex array
glVertexPointer( 3, GL_FLOAT, 0, vertices ); // récupération d'un pointer au début du tableau
glDrawArrays( GL_LINES, 0, numvertices ); // dessin des positions comme un ensemble de lignes

Si vous voulez dessiner des GL_QUADS, il vous faudra non pas un tableau de 3 * 2 * vertices, mais 3 * 4 * nombre de faces. Dans le cas d'une grille, le nombre de quads est équivalent à ( nombre de colonnes - 1 ) * ( nombre de lignes - 1 ).

Resources