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 :

Problème avec les VBO. [OpenGL 4.x]


Sujet :

OpenGL

  1. #1
    Invité
    Invité(e)
    Par défaut Problème avec les VBO.
    Salut, j'essaye d'afficher un rectangle avec un vbo mais ceci ne semble pas fonctionner :

    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
     
    #include <SFML/Graphics.hpp>
    #include <glew.h>
    #include <SFML/OpenGL.hpp>
     
    int main()
    {
        // create the window
        sf::Window window(sf::VideoMode(800, 600), "My window", sf::Style::Default, sf::ContextSettings(32));
        GLuint vbo;
        glewInit();
        glGenBuffers(1, &vbo);
        std::vector<sf::Vertex> vertices;
        vertices.push_back(sf::Vertex(sf::Vector2f(0, 0)));
        vertices.push_back(sf::Vertex(sf::Vector2f(100, 0)));
        vertices.push_back(sf::Vertex(sf::Vector2f(100, 50)));
        vertices.push_back(sf::Vertex(sf::Vector2f(0, 50)));
        glBindBuffer(GL_ARRAY_BUFFER,vbo);
        glBufferData(GL_ARRAY_BUFFER,vertices.size() * sizeof(sf::Vertex),&vertices[0],GL_STREAM_DRAW);
        glBindBuffer(GL_ARRAY_BUFFER, 0);
        // run the program as long as the window is open
        while (window.isOpen())
        {
            // check all the window's events that were triggered since the last iteration of the loop
            sf::Event event;
            while (window.pollEvent(event))
            {
                // "close requested" event: we close the window
                if (event.type == sf::Event::Closed)
                    window.close();
                else if (event.type == sf::Event::Resized)
                    // adjust the viewport when the window is resized
                    glViewport(0, 0, event.size.width, event.size.height);
            }
     
            // clear the window with black color
            glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
            const char* data = reinterpret_cast<const char*>(&vertices[0]);
            glEnableClientState(GL_VERTEX_ARRAY);
            glEnableClientState(GL_COLOR_ARRAY);
            glEnableClientState(GL_TEXTURE_COORD_ARRAY);
            glBindBuffer(GL_ARRAY_BUFFER, vbo);
            glVertexPointer(2, GL_FLOAT, sizeof(sf::Vertex), data + 0);
            glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(sf::Vertex), data + 8);
            glTexCoordPointer(2, GL_FLOAT, sizeof(sf::Vertex), data + 12);
            glDisableClientState(GL_VERTEX_ARRAY);
            glDisableClientState(GL_COLOR_ARRAY);
            glDisableClientState(GL_TEXTURE_COORD_ARRAY);
            glBindBuffer(GL_ARRAY_BUFFER, 0);
            glDrawArrays(GL_QUADS, 0, vertices.size());
            // draw everything here...
            // window.draw(...);
     
            // end the current frame
            window.display();
        }
        glDeleteBuffers(1, &vbo);
        return 0;
    }
    Ce code source ne m'afficher rien du tout hors que avec un vertexarray ça fonctionne sans problème.

    PS : je précise que l'extension pour les vbo est supportée par mon pc.
    Dernière modification par LittleWhite ; 19/07/2014 à 17h11. Motif: Tag

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bon je crois que j'ai trouvé, contrairement à ce que je pensais, apparemment, il faut désactivé le buffer avec glBindBuffer avant les appels à glPointer et glDrawArrays :
    J'ai donc retiré mon appel à glBindBuffer sur la vbo avant mes appels à glPointer et là ça marche.
    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
     
    #include <SFML/Graphics.hpp>
    #include <glew.h>
    #include <SFML/OpenGL.hpp>
    #include <iostream>
    int main()
    {
        // create the window
        sf::Window window(sf::VideoMode(800, 600), "My window", sf::Style::Default, sf::ContextSettings(32));
        GLuint vbo;
        glewInit();
        glGenBuffers(1, &vbo);
        std::vector<sf::Vertex> vertices;
        vertices.push_back(sf::Vertex(sf::Vector2f(0, 0)));
        vertices.push_back(sf::Vertex(sf::Vector2f(100, 0)));
        vertices.push_back(sf::Vertex(sf::Vector2f(100, 50)));
        vertices.push_back(sf::Vertex(sf::Vector2f(0, 50)));
        glBindBuffer(GL_ARRAY_BUFFER,vbo);
        glBufferData(GL_ARRAY_BUFFER,vertices.size() * sizeof(sf::Vertex),&vertices[0],GL_STREAM_DRAW);
        glBindBuffer(GL_ARRAY_BUFFER, 0);
        // run the program as long as the window is open
        while (window.isOpen())
        {
            // check all the window's events that were triggered since the last iteration of the loop
            sf::Event event;
            while (window.pollEvent(event))
            {
                // "close requested" event: we close the window
                if (event.type == sf::Event::Closed)
                    window.close();
                else if (event.type == sf::Event::Resized)
                    // adjust the viewport when the window is resized
                    glViewport(0, 0, event.size.width, event.size.height);
            }
     
            // clear the window with black color
            glClear(GL_COLOR_BUFFER_BIT);
     
            const char* data = reinterpret_cast<const char*>(&vertices[0]);
     
            glEnableClientState(GL_VERTEX_ARRAY);
            glEnableClientState(GL_COLOR_ARRAY);
            glEnableClientState(GL_TEXTURE_COORD_ARRAY);
     
            glVertexPointer(2, GL_FLOAT, sizeof(sf::Vertex), data + 0);
            glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(sf::Vertex), data + 8);
            glTexCoordPointer(2, GL_FLOAT, sizeof(sf::Vertex), data + 12);
     
     
            glDrawArrays(GL_QUADS, 0, vertices.size());
            glDisableClientState(GL_VERTEX_ARRAY);
            glDisableClientState(GL_COLOR_ARRAY);
            glDisableClientState(GL_TEXTURE_COORD_ARRAY);
     
     
            // draw everything here...
            // window.draw(...);
     
            // end the current frame
            window.display();
        }
        glDeleteBuffers(1, &vbo);
        return 0;
    }
    PS : A moins que dans ce cas là ça me fait comme si c'était un vertexarray..., bref, je vais pas me casser la tête là dessus je pense que le problème vient plutôt d'opengl qui ne veut pas bin ma vbo pour la dessiner.
    Dernière modification par Invité ; 03/05/2014 à 20h54.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bon je pense que j'ai trouvé ne fait il semble que glClientState soit déprécié dans les nouvelles versions d'opengl et qu'il faut utiliser glVertexAttrib à la place...

    Aïe, j'ai un pc qui ne supporte que la version 1 de open et vetexAttrib n'est disponible qu'à partir de la version 2, je vais devoir faire un test sur la version d'opengl...

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bon finalement en fait c'était tout con, dans mes fonctions glVertex, glColor et glTexCoord pointer je m'étais trompé, j'avais mis l'adresse de mes tableaux mais en fait il ne fallait pas la mettre car comme les données sont déjà dans le vbo, il fallait juste préciser l'offset :

    Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    glVertexPointer(2, GL_FLOAT, sizeof(sf::Vertex), (GLvoid*)  0);
    glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(sf::Vertex), (GLvoid*)   + 8);
    glTexCoordPointer(2, GL_FLOAT, sizeof(sf::Vertex), (GLvoid*)   + 12);

    Donc, 0, 8 et 12 à la place de data + 0, data + 8 et data + 12, rha, je m'en veux à mort sur ce coup là!

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

Discussions similaires

  1. [OpenGL 3.x] [JOGL] Problème de multi-thread avec les VBO
    Par darksamus1 dans le forum OpenGL
    Réponses: 4
    Dernier message: 02/07/2013, 12h47
  2. [débutant] problème avec les VBO
    Par TNT89 dans le forum OpenGL
    Réponses: 5
    Dernier message: 29/12/2009, 19h24
  3. Problème avec les apostrophes
    Par misterbillyboy dans le forum Requêtes
    Réponses: 2
    Dernier message: 15/07/2003, 16h39
  4. Problème avec les fichiers .JPG
    Par cprogil dans le forum Langage
    Réponses: 5
    Dernier message: 10/06/2003, 15h44
  5. []Problème avec les formulaires Outlook
    Par davidinfo dans le forum Outlook
    Réponses: 6
    Dernier message: 05/12/2002, 09h59

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