Bonjour
J'ai développé un VBO entrelacé qui se compose de structures Vertex, définies comme suit :
Je tente d'en faire un affichage. Je réussis à placer mes points, et à récupérer les coordonnées de texture, (les textures s'affichent), mais il semblerait que les normales s'envolent quelque part :/.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 struct Vertex { double positions[3]; double textcoords[2]; double normals[3]; };
Je ne comprends pas, d'autant plus qu'une fonction d'affichage exécutée dans la boucle générale me fait constater que mes normales sont bien présentes...
Code du bind pour les variables non uniformes :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 glBindAttribLocation (shader->getProgramID(), 0, "in_Vertex") ; glBindAttribLocation (shader->getProgramID(), 1, "in_TextCoord") ; glBindAttribLocation (shader->getProgramID(), 2, "in_Normal") ;Mon stride est correct, et mes buffer osset semblent ok, alors je ne comprends pas.
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 void ElementsGroup::draw(Matrix4& projection, Matrix4& modelview ,const Shader * shader) const { // Activation du shader et des tableaux Vertex Attrib glUseProgram(shader->getProgramID()); // Envoi de variables uniformes ............ // Bind les Buffers glBindBuffer(GL_ARRAY_BUFFER, vbuffer); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibuffer3); glBindTexture(GL_TEXTURE_2D, m_material.getTexture().getID()); // Activation des tableaux génériques glEnableVertexAttribArray(0); glEnableVertexAttribArray(1); glEnableVertexAttribArray(2); // Envoi des vertices glVertexAttribPointer(0, 3, GL_DOUBLE, GL_FALSE, sizeof(Vertex), 0); glVertexAttribPointer(1, 2, GL_DOUBLE, GL_TRUE, sizeof(Vertex), (const GLvoid*)(3*sizeof(double))); glVertexAttribPointer(2, 3, GL_DOUBLE, GL_FALSE, sizeof(Vertex), (const GLvoid*)(5*sizeof(double))); glDrawElements(GL_TRIANGLES, m_nb_tri*3, GL_UNSIGNED_INT, 0); glDisableVertexAttribArray(2); glDisableVertexAttribArray(1); glDisableVertexAttribArray(0); glBindBuffer(GL_ARRAY_BUFFER, 0); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); glBindTexture(GL_TEXTURE_2D, 0); glUseProgram(0); }
J'ai essayé d'échanger normals et textcoords dans la structure, et je devais alors spécifier des bufferoffset vraiment incohérents pour que cela fonctionne :
avec
(et la structure Vertex correspondante)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 glBindAttribLocation (shader->getProgramID(), 0, "in_Vertex") ; glBindAttribLocation (shader->getProgramID(), 1, "in_Normal") ; glBindAttribLocation (shader->getProgramID(), 2, "in_TextCoord") ;
Je devais mettre :
alors que j'aurais plutot du avoir : (offset différents)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 glVertexAttribPointer(0, 3, GL_DOUBLE, GL_FALSE, sizeof(Vertex), 0); glVertexAttribPointer(1, 3, GL_DOUBLE, GL_FALSE, sizeof(Vertex), (const GLvoid*)(6*sizeof(double))); glVertexAttribPointer(2, 2, GL_DOUBLE, GL_TRUE, sizeof(Vertex), (const GLvoid*)(3*sizeof(double)));
il n'empêche que dans tous les cas, je ne comprends pas où mes normales s'en vont...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 glVertexAttribPointer(0, 3, GL_DOUBLE, GL_FALSE, sizeof(Vertex), 0); glVertexAttribPointer(1, 3, GL_DOUBLE, GL_FALSE , sizeof(Vertex), (const GLvoid*)(3*sizeof(double))); glVertexAttribPointer(2, 2, GL_DOUBLE, GL_TRUE, sizeof(Vertex), (const GLvoid*)(6*sizeof(double)));
Dans mon Vertex Shader, j'ai bien en début de fichier :
in vec3 in_Vertex;
in vec2 in_TextCoord;
in vec3 in_Normal;
Voilà, si quelqu'un a une petite idée, je suis preneur...
Merci,
Cordialement,
Partager