Debogage Vertex Buffer Object
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:
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:
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);
}
} |