Bonjour à tous
Je m'intéresse en ce moment aux vbos et je doit dire que malgré de nombreux tutos je galère encore pas mal et je me heurte à un problème d'affichage pour ne serait-ce qu'un cube. Je ne vois en effet aucun point s'afficher lorsque j'utilise les vbos, ce qui n'est pas le cas avec une méthode "classique" glBegin(...) (mon problème ne vient donc pas d'un mauvais positionnement de la caméra ou quelque chose dans le genre). Voici mon code :
Comme vous pouvez le voir, je génère tout d'abord 4 buffers (un pour les vertices, un pour les index, un pour les couleurs et un pour les textures). Je les remplis par des tableaux de données dynamiques dont les valeurs proviennent des 4 références sur std::list<int ou double> passées en argument, dont la taille est passée en paramètre à chaque glBufferData (par exemple m_vertexBufferList->size()). Les 4 listes sont pointées dans la classe par 4 pointeurs et ces 4 pointeurs sont "bons" au début de l'affichage (pas de problème de mémoire ni de modification de données).
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 glGenBuffers(4,m_numberVBO); glBindBuffer(GL_ARRAY_BUFFER, m_numberVBO[0]); glBufferData(GL_ARRAY_BUFFER, m_vertexBufferList->size(), m_vertexBuffer, GL_DYNAMIC_DRAW); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_numberVBO[1]); glBufferData(GL_ELEMENT_ARRAY_BUFFER, m_elementBufferList->size(), m_elementBuffer, GL_DYNAMIC_DRAW); if(m_bindColor) { glBindBuffer(GL_ARRAY_BUFFER, m_numberVBO[2]); glBufferData(GL_ARRAY_BUFFER, m_colorBufferList->size(), m_colorBuffer, GL_DYNAMIC_DRAW); } if(m_bindTexture) { glBindBuffer(GL_ARRAY_BUFFER, m_numberVBO[3]); glBufferData(GL_ARRAY_BUFFER, m_textCoordBufferList->size(), m_textCoordBuffer, GL_DYNAMIC_DRAW); } glBindBuffer(GL_ARRAY_BUFFER, 0); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
Le problème est donc lors de l'affichage, mais je ne sais pas où (voici mon code) :
C'est la que j'ai besoin de votre aide, car rien de s'affiche et pourtant je ne vois pas ce qui peut clocher dans ce code. Ai-je oublié quelque chose de fondamental ? Sachant que cette fonction draw est appelée dans un contexte permettant l'affichage d'éléments (lorsque j'utilise les glBegin() dans la fonction appelant draw, après le glClear() et avant le glFlush(), les surfaces s'affichent !)
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 glBindBuffer(GL_ARRAY_BUFFER, m_numberVBO[0]); glVertexPointer(3, GL_DOUBLE, 3*m_sizeVBO*sizeof(double),((double*)NULL + (0))); if(m_bindColor) { glBindBuffer(GL_ARRAY_BUFFER, m_numberVBO[2]); glColorPointer(3, GL_DOUBLE, 3*m_sizeVBO*sizeof(double), ((double*)NULL + (0))); } if(m_bindTexture) { glBindBuffer(GL_ARRAY_BUFFER, m_numberVBO[3]); glTexCoordPointer(2, GL_DOUBLE, 2*m_sizeVBO*sizeof(double), ((double*)NULL + (0))); } glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_numberVBO[1]); glEnableClientState(GL_VERTEX_ARRAY); if(m_bindColor) glEnableClientState(GL_COLOR_ARRAY); if(m_bindTexture) glEnableClientState(GL_TEXTURE_COORD_ARRAY); glDrawElements(GL_QUADS, m_elementBufferList->size(), GL_UNSIGNED_INT, ((int*)NULL + (0))); if(m_bindColor) glDisableClientState(GL_COLOR_ARRAY); if(m_bindTexture) glDisableClientState(GL_TEXTURE_COORD_ARRAY); glDisableClientState(GL_VERTEX_ARRAY);
J'espère avoir été relativement clair, si vous avez des questions n'hésitez pas![]()
Partager