[Problème] Vertex Buffer Object
:salut: ,
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
Code:
1 2 3 4 5
|
valarray <GLfloat> * Vertices;
valarray <GLuint> * Indices;
valarray <GLubyte> * Colours;
GLuint BufferName[3]; |
Ici, c'est au moment de la création de la heightmap .cpp
Je passe la creation de la heightmap.
Code:
1 2
|
glGenBuffersARB(3,BufferName); |
Ici, c'est le contenu de la fonction d'affichage pour la version VBO
Code:
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 ); |
Si vous avez une idée sur mon problème, je suis vraiment preneur (je comprend pas ce qu'il se passe :( )
Merci.