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 :
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] ;
}
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
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);
 
        }
}