,
Je débute sous open-gl. Pour apprendre, j'essaye de faire un générateur de heightmap (tout simple pour l'instant).
Je rencontre donc un problème pour utiliser les VBO et afficher ma heightmap.
Le problème se trouve au niveau de l'utilisation de "GL_COLOR_ARRAY".
Voici ce que je (ne) fais (pas) dans mon programme :
- aucune optimisation pour l'affichage (plus tard).
- pas de calcul des normales (j'ai pas encore compris leur utilité, calcul des lumières?)
J'ai fait des tests de performances sur 2 PC différents :
PC1 : radeon x850, proc P-D805
PC2 : Accelerator Graphic Intel, proc Celeron 3,06Ghz
Pour une heightmap de 256*256 soit (sauf erreur) 130050 triangles sans utiliser "GL_COLOR_ARRAY".
PC 1 : 130 FPS (VBO)
PC 2 : 30 FPS (VBO)
PC 1 : 46 FPS (Vertex Buffer Array Non Compilé)
PC 2 : 25 FPS (VBANC)
Les résultats semblent à peu près cohérent.
Pour une heightmap de 256*256 soit (sauf erreur) 130050 triangles avec "GL_COLOR_ARRAY".
PC 1 : 19 FPS (VBO)
PC 2 : 21 FPS (VBO)
PC 1 : 29 FPS (VBANC)
PC 2 : 22 FPS (VBANC)
Là, je comprend pas...
Voici, mon code d'affichage
Ici, les déclaration des tableaux et du buffer dans mon .h
Ici, c'est au moment de la création de la heightmap .cpp
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 valarray <GLfloat> * Vertices; valarray <GLuint> * Indices; valarray <GLubyte> * Colours; GLuint BufferName[3];
Je passe la creation de la heightmap.
Ici, c'est le contenu de la fonction d'affichage pour la version VBO
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 glGenBuffersARB(3,BufferName);
Si vous avez une idée sur mon problème, je suis vraiment preneur (je comprend pas ce qu'il se passe )
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
23
24
25
26
27 if(hasColor) { glEnableClientState ( GL_COLOR_ARRAY ); glBindBufferARB(GL_ARRAY_BUFFER_ARB, BufferName[2]); glBufferDataARB(GL_ARRAY_BUFFER_ARB, Size*Size*3*sizeof(GLubyte), &(*Colours)[0], GL_STATIC_DRAW_ARB); glColorPointer(3, GL_UNSIGNED_BYTE, 0, 0); } glBindBufferARB(GL_ARRAY_BUFFER_ARB, BufferName[1]); glBufferDataARB(GL_ARRAY_BUFFER_ARB, Size*Size*3*sizeof(GLfloat), &(*Vertices)[0], GL_STATIC_DRAW_ARB); glVertexPointer(3, GL_FLOAT, 0, 0); glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, BufferName[0]); glBufferDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, (Size-1)*(Size-1)*6*sizeof(GLuint), &(*Indices)[0] , GL_STATIC_DRAW_ARB); glIndexPointer(GL_UNSIGNED_INT, 0, 0); // Activation des parametres glEnableClientState ( GL_VERTEX_ARRAY ); // Affichage des elements glDrawElements ( GL_TRIANGLES, (Size-1)*(Size-1)*6 , GL_UNSIGNED_INT, 0 ); // Desactivation des parametres glDisableClientState ( GL_COLOR_ARRAY ); glDisableClientState ( GL_VERTEX_ARRAY );
Merci.
Partager