Salut, j'essaye de placer tout mes quads dans une vbo :

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
 
if (vboVertexBuffer == 0) {
                    GLuint vbo;
                    glCheck(glGenBuffers(1, &vbo));
                    const_cast<VertexArray*>(this)->vboVertexBuffer = static_cast<unsigned int>(vbo);
                    glCheck(glBindBuffer(GL_ARRAY_BUFFER, vboVertexBuffer));
                    glCheck(glBufferDataARB(GL_ARRAY_BUFFER_ARB, m_vertices.size() * sizeof(Vertex), &(m_vertices[0]), GL_DYNAMIC_DRAW));
                    glCheck(glBindBuffer(GL_ARRAY_BUFFER, 0));
                } else {
                    GLvoid *pos_vbo = nullptr;
                    glCheck(glBindBuffer(GL_ARRAY_BUFFER, vboVertexBuffer));
                    pos_vbo = glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY);
                    if (pos_vbo != nullptr) {
                        memcpy(pos_vbo,&m_vertices[0],  m_vertices.size() * sizeof(Vertex));
                        glCheck(glUnmapBuffer(GL_ARRAY_BUFFER));
                        pos_vbo = nullptr;
                    }
                    //glCheck(glBindBuffer(GL_ARRAY_BUFFER, 0));
                }
                if (vboNormalBuffer == 0) {
                    const_cast<VertexArray*>(this)->computeNormals();
                    GLuint vbo;
                    glCheck(glGenBuffers(1, &vbo));
                    const_cast<VertexArray*>(this)->vboNormalBuffer = static_cast<unsigned int>(vbo);
                    glCheck(glBindBuffer(GL_ARRAY_BUFFER, vboVertexBuffer));
                    glCheck(glBufferDataARB(GL_ARRAY_BUFFER_ARB, m_normals.size() * sizeof(Vector3f), &(m_normals[0]), GL_DYNAMIC_DRAW));
                    glCheck(glBindBuffer(GL_ARRAY_BUFFER, 0));
                } else {
                    const_cast<VertexArray*>(this)->computeNormals();
                    GLvoid *pos_vbo = nullptr;
                    glCheck(glBindBuffer(GL_ARRAY_BUFFER, vboNormalBuffer));
                    pos_vbo = glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY);
                    if (pos_vbo != nullptr) {
                        memcpy(pos_vbo,&m_normals[0],  m_normals.size() * sizeof(Vector3f));
                        glCheck(glUnmapBuffer(GL_ARRAY_BUFFER));
                        pos_vbo = nullptr;
                    }
                    //glCheck(glBindBuffer(GL_ARRAY_BUFFER, 0));
                }
                const_cast<VertexArray*>(this)->needToUpdateVBOBuffer = false;
Mais ça ne fonctionne pas lors du dessin tout ne se dessine pas et j'ai des GL_OUT_OF_MEMORY_ERROR :

Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
const char* data = reinterpret_cast<const char*>(vertices);
            const char* data2 = reinterpret_cast<const char*>(normals);
            glCheck(glBindBuffer(GL_ARRAY_BUFFER, states.vboVertexBuffer));
            glCheck(glVertexPointer(3, GL_FLOAT, sizeof(Vertex), data + 0));
            glCheck(glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(Vertex), data + 12));
            glCheck(glTexCoordPointer(2, GL_FLOAT, sizeof(Vertex), data + 16));
            glCheck(glBindBuffer(GL_ARRAY_BUFFER, states.vboNormalBuffer));
            glCheck(glNormalPointer(GL_FLOAT,sizeof(Vector3f), data2 + 0));
 static const GLenum modes[] = {GL_POINTS, GL_LINES, GL_LINE_STRIP, GL_TRIANGLES,
                                       GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN, GL_QUADS};
        GLenum mode = modes[type];
 
        // Draw the primitives
        glCheck(glDrawArrays(mode, 0, vertexCount));

Ai je fais une erreur quelque part ?