Bonjour,
J'essaye de faire marcher les vertex buffer object mais le résultat ressemble plus a de l'art moderne qu'au lapin que je suis sensé afficher.
Je pense qu'il y a une petite erreur quelque part mais pour la détecter je sais pas comment faire.
Comment faire pour corriger les fautes dans ces cas la ?
J'ai rien pour regarder les accès en mémoire de ma carte graphique, aucune erreur n'est renvoyée ni par le compilo ni par les fonctions d'openGL.
Y a t-il une technique, un outils pour deboguer l'utilisation des fonctions d'API graphique ?
A tout hasard, si quelqu'un arrive a trouver la faute, voici les extrait de mon code :
Mon code est du C++ il y a le gestionnaire VBO et la classe Maillage
Pour le gestionnaire :
Et voici pour le maillage :
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
28
29
30 int VBO::nbMaillage = 0 ;//BufferSize bool VBO::loadClosed = false ; //si le buffer est créé vector<Maillage*> VBO::maillage;//liste des maillages GLuint* VBO::BufferName= NULL; //GLuint BufferName[BufferSize]; void VBO::run(){ int cpt ; if ((nbMaillage > 0 )&&(maillage.empty() == false)){ BufferName = new GLuint[nbMaillage*2] ;//allocation de BufferName glGenBuffers((GLsizei)(nbMaillage*2),BufferName); loadClosed = true ; //chargement des maillages for( cpt = 0 ; cpt < maillage.size() ; cpt++){ maillage[cpt]->loadInBuffer() ; } } } void VBO::destroy() { //destruction des buffers glDeleteBuffers(nbMaillage*2,BufferName);GL_TEST_ERR loadClosed = false ; delete[] BufferName ; } GLuint VBO::getBufferName(int Bufferindex){ return BufferName[Bufferindex] ; }
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
28
29
30
31
32
33
34
35
36
37
38
39
40 //Attribus dans le header int nbSommet,nbIndex ; float *sommetData; int *indexData ;//nombre de face GLenum loadingMode ; // STATIC STREAM ou DYNAMIC int sommetSize,indexSize ; //taille en octet int numBuffer ; // numero dans le buffer //.cpp #define BUFFER_OFFSET(i) ((char*)NULL + (i)) Maillage::~Maillage(){ delete[] sommetData ; delete[] indexData ; } void Maillage::draw(){ if(VBO::isRunning() == true){ glBindBuffer(GL_ARRAY_BUFFER, VBO::getBufferName(numBuffer));GL_TEST_ERR glBufferData(GL_ARRAY_BUFFER, sommetSize, sommetData, GL_STREAM_DRAW);GL_TEST_ERR glColorPointer(3, GL_UNSIGNED_BYTE, 0, 0);GL_TEST_ERR glBindBuffer(GL_ARRAY_BUFFER, VBO::getBufferName(numBuffer+1));GL_TEST_ERR glBufferData(GL_ARRAY_BUFFER, sommetSize, sommetData, GL_STREAM_DRAW);GL_TEST_ERR glVertexPointer(3, GL_FLOAT, 0, 0);GL_TEST_ERR glEnableClientState(GL_VERTEX_ARRAY);GL_TEST_ERR glEnableClientState(GL_COLOR_ARRAY);GL_TEST_ERR //glDrawArrays(GL_TRIANGLES, 0, nbIndex*3);GL_TEST_ERR //test avec deux fonction differentes glDrawElements(GL_TRIANGLES,nbIndex*3,GL_UNSIGNED_INT,indexData) ; glDisableClientState(GL_COLOR_ARRAY); glDisableClientState(GL_VERTEX_ARRAY); } }
Partager