IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

OpenGL Discussion :

Soucis avec les vbos :


Sujet :

OpenGL

  1. #1
    Invité
    Invité(e)
    Par défaut Soucis avec les vbos :
    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 ?

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bon bah j'ai retiré les appels à glMap et glUnmapBuffer, car je n'en ai pas besoin en effet, vu que j'effectue déjà les transformations de vertices avec une matrice que je passe à opengl.

    Et là ça va beaucoup mieux et je n'ai plus ces messages d'erreurs.

    Et puis niveau perfs ça semblait pas être trop ça non plus.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Dates] souci avec les dates
    Par Ludo75 dans le forum Langage
    Réponses: 3
    Dernier message: 22/02/2006, 17h15
  2. Soucis avec les JTables et les listener
    Par shingo dans le forum Composants
    Réponses: 2
    Dernier message: 22/02/2006, 11h51
  3. Soucis avec les Graphiques dans les états
    Par Chococrocq dans le forum IHM
    Réponses: 27
    Dernier message: 04/01/2006, 19h03
  4. petit soucis avec les listes
    Par Death83 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 03/09/2005, 10h08
  5. Réponses: 7
    Dernier message: 05/10/2004, 13h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo