Bonjour

J'ai développé un VBO entrelacé qui se compose de structures Vertex, définies comme suit :

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 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 :/.
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") ;
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);
}
Mon stride est correct, et mes buffer osset semblent ok, alors je ne comprends pas.

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

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") ;
(et la structure Vertex correspondante)

Je devais mettre :
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)));
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*)(3*sizeof(double)));
    glVertexAttribPointer(2, 2, GL_DOUBLE, GL_TRUE, sizeof(Vertex), (const GLvoid*)(6*sizeof(double)));
il n'empêche que dans tous les cas, je ne comprends pas où mes normales s'en vont...

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,