Voilà, je suis en train de m'initier à quelques techniques simples d'optimisation. Les display lists, c'est vu, c'est très facile. Mais là je suis en train d'essayer de comprendre le fonctionnement des vertex arrays, mais là j'ai plus de mal et je me pose pas mal de questions sur leur fonctionnement...
Si je comprends bien, il faut, dans un premier temps, déterminer dans des tableaux toutes les valeurs que l'on souhaitent (vertices, couleurs, coordonnées de texture, couleurs secondaires...) dans des tableaux de valeurs identiques à ce qu'on ferait avec glBegin.
Par exemple, si je veux dessiner un carré texturé avec deux couleurs de fond pour le GL_MODULATE :
Ceci nous donnera en vertex arrays :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 glBegin (GL_TRIANGLES_STRIP); glColor3ub (255, 0, 255); glTexCoord2f (1.0f, 0.0f); glVertex3f (1.0f, -1.0f, 0.0f); glTexCoord2f (0.0f, 0.0f); glVertex3f (-1.0f, -1.0f, 0.0f); glColor3ub (0, 0, 255); glTexCoord2f (1.0f, 1.0f); glVertex3f (1.0f, 1.0f, 0.0f); glTexCoord2f (0.0f, 1.0f); glVertex3f (-1.0f, 1.0f, 0.0f); glEnd ();
Après on active les vertex arrays avec glEnableClientState pour tex, couleur, vertices.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 struct sVertices { GLfloat x, y, z; } struct sTexCoords { GLfloat s, t; } struct sCouleurs { GLubyte r, g, b; } sVertices verticesTab [4] = { {1.0f, -1.0f, 0.0f}, {-1.0f, -1.0f, 0.0f}, {1.0f, 1.0f, 0.0f}, {-1.0f, 1.0f, 0.0f} }; sTexCoords [4] = { {1.0f, 0.0f}, {0.0f, 0.0f}, {1.0f, 1.0f}, {0.0f, 1.0f} }; sCouleurs [2] = { {255, 0, 255}, {0, 0, 255} };
Et ensuite on charge le tout :
glVertexPointer(3, GL_FLOAT, 0, verticesTab);
glColorPointer(3, GL_UNSIGNED_BYTE, 0, sCouleurs);
glTexCoordPointer(2, GL_FLOAT, 0, sTexCoords);
Puis enfin on dessine avec :
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
Bon alors pour commencer je sais pas trop comment cet appel fonctionne...
Comment fait-il pour savoir si je veux spécifier la deuxième couleur que pour les deux dernières vertices comme dans mon premier exemple ? En gros je voudrais savoir quels appels cette fonction effectue, en équivalent glBegin/glEnd. En quoi ceci améliorerait les performances étant donné qu'il doit quand même dessiner les vertices comme le ferait glBegin/glEnd ? En quoi sa conception diffère de ce dernier ?
D'autre part, si on veut changer les coordonnées du carré, par exemple si on veut le décaler d'une unité ? Euuuh... On fait un glTranslate, c'est bien ça ?
Enfin, mon livre parle de pleins d'autres techniques qu'il dit plus efficace : glMultiDrawArrays (pareil que le premier sauf qu'on peut créer plusieurs éléments d'un coup, facile), glDrawElements : alors là c'est plus compliqué : un argument, GLvoid * indices, me gêne. J'ai un peu de mal à comprendre ce qu'ils veulent dire par : "indices is an array containing indexes for the vertices you want to render". A quoi sert cette fonction ?
il y a aussi le glDrawRangeElements et glInterleavedArrays (pour ce dernier je pense avoir compris)...
Sinon le livre parle aussi des vertex buffer objects introduit avec OGL 1.5 en disant qu'ils sont bien plus performants, mais ne les traîte pas. Sont-ils vraiment plus performants, et plus durs à utiliser ? Et quelle est la différence dans leur fonctionnement par rapport à des vertex arrays. Voilà ^^
Partager