Bonjour,

J'essaye en ce moment d'intégrer dans mon projet des fichiers .obj avec la méthode des buffers.
Pour l'instant, j'arrive bien à mettre les vertex ainsi que les couleurs, mais le soucis vient des textures. Elles ne s'applique pas comme il le faudrait.

J'essaye de coller un IBO de Vertex avec un IBO de Texture vu qu'ils n'ont pas les mêmes indices pour les sommets, il doit me manquer un petit truc, mais je n'arrive pas à le voir.

VectorVBO = liste des coordonnées des sommets : x0, y0, z0, x1, y1, z1, ...
VectorTexVBO = liste des coordonnées des textures : x0, y0, x1, y1, ...
facesTrianglesVBO = sommets d'un triangle : a0, a1, a2, b0, b1, b2
texturesTrianglesVBO = position texture d'un triangle : a0, a1, a2, b0, b1, b2
facesQuadVBO = sommets d'un polygone : a0, a1, a2, a3, b0, b1, b2, b3
texturesQuadVBO = position texture d'un polygone : a0, a1, a2, a3, b0, b1, b2, b3

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
41
42
        struct InfosTex
        {
            QString mtl;
            GLuint texture;
        };
        struct InfosColWaveFront
        {
            int rouge;
            int vert;
            int bleu;
        };
        QVector<InfosTex>* Textures;
        QVector<InfosTex>* Couleurs;
        QVector<InfosColWaveFront>* ColWaveFront;
        QVector<GLuint>* TexWaveFront;
        QGLWidget *DBparent;
 
 
        /** NEW ITEM */
        PFNGLGENBUFFERSARBPROC glGenBuffers;
        PFNGLDELETEBUFFERSARBPROC glDeleteBuffers;
        PFNGLBINDBUFFERARBPROC glBindBuffer;
        PFNGLBUFFERDATAARBPROC glBufferData;
        PFNGLBUFFERSUBDATAARBPROC glBufferSubData;
        GLuint buf;
        GLuint bufTex;
        QVector<float>* vectorVBO;
        QVector<float>* vectorTexVBO;
        struct ParamIndexVBO{
            InfosColWaveFront color;
            GLuint texture;
            QVector<unsigned int>* facesTrianglesVBO;
            QVector<unsigned int>* facesQuadsVBO;
            QVector<unsigned int>* texturesTrianglesVBO;
            QVector<unsigned int>* texturesQuadsVBO;
            GLuint bufIndexTriangles;
            GLuint bufIndexQuads;
            GLuint bufIndexTexTriangles;
            GLuint bufIndexTexQuads;
            bool ok;
        };
        QVector<ParamIndexVBO>* tabParamIndexVBO;

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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
 
    float* tabVBO = vectorVBO->data();
    int nb_elem = vectorVBO->size();
    int taille_totale = nb_elem * sizeof (float);
    glGenBuffers(1, &buf);
    glBindBuffer(GL_ARRAY_BUFFER, buf);
    glBufferData(GL_ARRAY_BUFFER, nb_elem * sizeof (float), NULL, GL_STREAM_DRAW);
    glBufferSubData(GL_ARRAY_BUFFER, 0, nb_elem * sizeof (float), tabVBO);
    glBindBuffer(GL_ARRAY_BUFFER, 0);
 
    float* tabTexVBO = vectorTexVBO->data();
    int nb_elem_tex = vectorTexVBO->size();
    glGenBuffers(1, &bufTex);
    glBindBuffer(GL_ARRAY_BUFFER, bufTex);
    glBufferData(GL_ARRAY_BUFFER, nb_elem_tex * sizeof (float), NULL, GL_STREAM_DRAW);
    glBufferSubData(GL_ARRAY_BUFFER, 0, nb_elem_tex * sizeof (float), tabTexVBO);
    glBindBuffer(GL_ARRAY_BUFFER, 0);
 
    if (tabParamIndexVBO->size()>0) for(int i=0;i <tabParamIndexVBO->size(); i++) {
        ParamIndexVBO oneParamIndexVBO = tabParamIndexVBO->at(i);
        if (oneParamIndexVBO.facesTrianglesVBO->size() > 0) {
            //cout << "Triangles in GPU (taille) : " << oneParamIndexVBO.facesTrianglesVBO->size() << " (" << oneParamIndexVBO.facesTrianglesVBO->size() * sizeof (unsigned int) << ")" << endl;
            taille_totale += oneParamIndexVBO.facesTrianglesVBO->size() * sizeof (unsigned int);
            glGenBuffers(1, &oneParamIndexVBO.bufIndexTriangles);
            glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, oneParamIndexVBO.bufIndexTriangles);
            glBufferData(GL_ELEMENT_ARRAY_BUFFER, oneParamIndexVBO.facesTrianglesVBO->size() * sizeof (unsigned int), NULL, GL_STREAM_DRAW);
            glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, oneParamIndexVBO.facesTrianglesVBO->size() * sizeof (unsigned int), oneParamIndexVBO.facesTrianglesVBO->data());
            glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
            (*tabParamIndexVBO)[i].bufIndexTriangles = oneParamIndexVBO.bufIndexTriangles;
            if (oneParamIndexVBO.texture > 0) {
                glGenBuffers(1, &oneParamIndexVBO.bufIndexTexTriangles);
                glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, oneParamIndexVBO.bufIndexTexTriangles);
                glBufferData(GL_ELEMENT_ARRAY_BUFFER, oneParamIndexVBO.texturesTrianglesVBO->size() * sizeof (unsigned int), NULL, GL_STREAM_DRAW);
                glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, oneParamIndexVBO.texturesTrianglesVBO->size() * sizeof (unsigned int), oneParamIndexVBO.texturesTrianglesVBO->data());
                glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
                (*tabParamIndexVBO)[i].bufIndexTexTriangles = oneParamIndexVBO.bufIndexTexTriangles;
            }
        }
        if (oneParamIndexVBO.facesQuadsVBO->size() > 0) {
            //cout << "Quads in GPU (taille) : " << oneParamIndexVBO.facesQuadsVBO->size() << " (" << oneParamIndexVBO.facesQuadsVBO->size() * sizeof (unsigned int) << ")" << endl;
            taille_totale += oneParamIndexVBO.facesQuadsVBO->size() * sizeof (unsigned int);
            glGenBuffers(1, &oneParamIndexVBO.bufIndexQuads);
            glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, oneParamIndexVBO.bufIndexQuads);
            glBufferData(GL_ELEMENT_ARRAY_BUFFER, oneParamIndexVBO.facesQuadsVBO->size() * sizeof (unsigned int), NULL, GL_STREAM_DRAW);
            glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, oneParamIndexVBO.facesQuadsVBO->size() * sizeof (unsigned int), oneParamIndexVBO.facesQuadsVBO->data());
            glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
            (*tabParamIndexVBO)[i].bufIndexQuads = oneParamIndexVBO.bufIndexQuads;
            if (oneParamIndexVBO.texture > 0) {
                glGenBuffers(1, &oneParamIndexVBO.bufIndexTexQuads);
                glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, oneParamIndexVBO.bufIndexTexQuads);
                glBufferData(GL_ELEMENT_ARRAY_BUFFER, oneParamIndexVBO.texturesQuadsVBO->size() * sizeof (unsigned int), NULL, GL_STREAM_DRAW);
                glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, oneParamIndexVBO.texturesQuadsVBO->size() * sizeof (unsigned int), oneParamIndexVBO.texturesQuadsVBO->data());
                glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
                (*tabParamIndexVBO)[i].bufIndexTexQuads = oneParamIndexVBO.bufIndexTexQuads;
            }
        }
    }
    *idCallListMap = glGenLists(1);
    glNewList(*idCallListMap, GL_COMPILE);
        if (tabParamIndexVBO->size()>0) for(int i=0;i <tabParamIndexVBO->size(); i++) {
            ParamIndexVBO oneParamIndexVBO = tabParamIndexVBO->at(i);
            glColor3ub(oneParamIndexVBO.color.rouge,oneParamIndexVBO.color.vert,oneParamIndexVBO.color.bleu);
            if (oneParamIndexVBO.facesTrianglesVBO->size() > 0) {
                glEnable(GL_TEXTURE_2D);
                glBindTexture(GL_TEXTURE_2D, oneParamIndexVBO.texture);
                glBindBuffer(GL_ARRAY_BUFFER, buf);
                glVertexPointer(3, GL_FLOAT, 0, BUFFER_OFFSET(0));
                glBindBuffer(GL_ARRAY_BUFFER, bufTex);
                glTexCoordPointer(2, GL_FLOAT, 0, BUFFER_OFFSET(0));
                glEnableClientState(GL_VERTEX_ARRAY);
                glEnableClientState(GL_TEXTURE_COORD_ARRAY);
                glClientActiveTexture(GL_TEXTURE0);
                glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, oneParamIndexVBO.bufIndexTriangles);
                glDrawElements(GL_TRIANGLES, oneParamIndexVBO.facesTrianglesVBO->size(), GL_UNSIGNED_INT, BUFFER_OFFSET(0));
                glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, oneParamIndexVBO.bufIndexTexTriangles);
                glDrawElements(GL_QUADS, oneParamIndexVBO.texturesTrianglesVBO->size(), GL_UNSIGNED_INT, BUFFER_OFFSET(0));
                glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
                glDisableClientState(GL_TEXTURE_COORD_ARRAY);
                glDisableClientState(GL_VERTEX_ARRAY);
                glBindBuffer(GL_ARRAY_BUFFER, 0);
            }
            if (oneParamIndexVBO.facesQuadsVBO->size() > 0) {
                glEnable(GL_TEXTURE_2D);
                glBindTexture(GL_TEXTURE_2D, oneParamIndexVBO.texture);
                glBindBuffer(GL_ARRAY_BUFFER, buf);
                glVertexPointer(3, GL_FLOAT, 0, BUFFER_OFFSET(0));
                glBindBuffer(GL_ARRAY_BUFFER, bufTex);
                glTexCoordPointer(2, GL_FLOAT, 0, BUFFER_OFFSET(0));
                glEnableClientState(GL_VERTEX_ARRAY);
                glEnableClientState(GL_TEXTURE_COORD_ARRAY);
                glClientActiveTexture(GL_TEXTURE0);
                glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, oneParamIndexVBO.bufIndexQuads);
                glDrawElements(GL_QUADS, oneParamIndexVBO.facesQuadsVBO->size(), GL_UNSIGNED_INT, BUFFER_OFFSET(0));
                glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, oneParamIndexVBO.bufIndexTexQuads);
                glDrawElements(GL_QUADS, oneParamIndexVBO.texturesQuadsVBO->size(), GL_UNSIGNED_INT, BUFFER_OFFSET(0));
                glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
                glDisableClientState(GL_TEXTURE_COORD_ARRAY);
                glDisableClientState(GL_VERTEX_ARRAY);
                glBindBuffer(GL_ARRAY_BUFFER, 0);
            }
            //glDisable(GL_TEXTURE_2D);
        }
    glEndList();
Voici le lien vers le projet et un objet de test.
Source + Objet

Merci de votre aide.