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 VBO (écran qui clignote)


Sujet :

OpenGL

  1. #1
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Août 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2007
    Messages : 61
    Points : 30
    Points
    30
    Par défaut Problème avec VBO (écran qui clignote)
    Bonjour,

    Je débute en OpenGL et essaie d'optimiser mon programme. J'ai réussi dans un premier temps à transformer tous mes glvertex et Co. en vertex array. Tout s'affiche bien. Par contre j'ai voulu essayer d'intégrer des VBO et j'ai des soucis : au premier lancement, ça s'est affiché (un peu tordu pour un mur, mais j'avais une image) et depuis, j'arrive plus à avoir quoi que ce soit. Quand je lance le programme, l'écran se met à clignoter en noir (tout l'écran, pas seulement la fenêtre que je créée) et si je le laisse tourner, au bout de quelques secondes, "aborted" s'affiche sur ma console.

    Si j'enlève ce bout de code, tout s'affiche de nouveau bien, étant donné que le glDrawElements() n'est pas appelé tout de suite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    glGenBuffers(2, final->buf_couloir);
     
    glBindBuffer(GL_ARRAY_BUFFER, final->buf_couloir[0]);
    glBufferData(GL_ARRAY_BUFFER, sizeof(final->couloir_array), final->couloir_array, GL_STATIC_DRAW);
     
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, final->buf_couloir[1]);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(final->indice), final->indice, GL_STATIC_DRAW);

    Merci de m'aider car je ne comprends pas du tout ce qu'il se passe.

  2. #2
    Membre expérimenté
    Homme Profil pro
    Développeur
    Inscrit en
    Juillet 2009
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Juillet 2009
    Messages : 416
    Points : 1 443
    Points
    1 443
    Par défaut
    Ton final->couloir_array et ton final->indice sont de quel type? Je ne suis pas sûr qu'un sizeof soit adapté pour trouver leur taille (si ce sont de simples tableaux, ils te retourneront simplement la taille d'un pointeur...)

  3. #3
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Août 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2007
    Messages : 61
    Points : 30
    Points
    30
    Par défaut
    Je continue à chercher, mais sans succès. J'ai modifié le second paramètre de glGenBuffers en le mettant en global, fait des glGetError (qui me revoit toujours GL_NO_ERROR), appelé glIsBuffer après glBindBuffer...

    Si je demande la création d'un seul buffer avec glGenBuffers(1, &buf), l'écran ne clignote plus, le programme tourne, mais rien ne s'affiche... Mais il tourne, quand j'appuie sur une touche (comportement que j'ai codé) les coordonnées qui s'affichent sont cohérentes.

    une idée qui m'aiderait à sortir de ce problème ?

    Pour info, je developpe sous linux avec mesa.

  4. #4
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Août 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2007
    Messages : 61
    Points : 30
    Points
    30
    Par défaut
    j'ai déjà virer le sizeof pour le size, cela ne change rien, mais merci pour l'idée. Ma structure ressemble à cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    typedef struct{
        GLuint buf_couloir[2];
        GLfloat couloir_array[N_VERT_COULOIR * P_SIZE + N_VERT_COULOIR * T_SIZE + N_VERT_COULOIR * N_SIZE];
        GLuint indice[N_VERT_COULOIR];
    }donnee_couloir;

  5. #5
    Membre expérimenté
    Homme Profil pro
    Développeur
    Inscrit en
    Juillet 2009
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Juillet 2009
    Messages : 416
    Points : 1 443
    Points
    1 443
    Par défaut
    Je pensais plutôt essayer par exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, N_VERT_COULOIR*(final->indice[0]), final->indice, GL_STATIC_DRAW);
    à la place de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(final->indice), final->indice, GL_STATIC_DRAW);

  6. #6
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Août 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2007
    Messages : 61
    Points : 30
    Points
    30
    Par défaut
    VICTOIRE !!! Ca marche,

    En fait comme je n'utilise pour l'instant qu'à un seul endroit les VBO, si je ne faisais pas un appel à glbindbuffer avec 0 comme identifiant après m'en être servi, les appels suivants à glVertexPointer (avec des vertex array) étaient faussés car gl les faisaient pointer sur mes VBO. Je vais pouvoir avancer. J'étais à deux doigts de laiser tomber. Merci pour ton coup de main Guntha, mais le N_VERT_COULOIR*(final->indice[0]) pour le paramètre size fait un segmentation fault.

    Je mets le code, ça pourra peut-être servir à quelqu'un :
    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
     
    glGenBuffers(2, buf_couloir);
        if(glGetError() != GL_NO_ERROR)
            printf("erreur \n");
     
        glBindBuffer(GL_ARRAY_BUFFER, buf_couloir[0]);
        if(glIsBuffer(buf_couloir[0]))
            glBufferData(GL_ARRAY_BUFFER, sizeof(final->couloir_array), final->couloir_array, GL_STATIC_DRAW);
     
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buf_couloir[1]);
        if(glIsBuffer(buf_couloir[1]))
            glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(final->indice), final->indice, GL_STATIC_DRAW);
     
        glBindBuffer(GL_ARRAY_BUFFER, 0);
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
    et pareil quand on dessine

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
         ...
        glDrawElements(GL_QUADS, N_VERT_COULOIR, GL_UNSIGNED_INT, 0);
        glBindBuffer(GL_ARRAY_BUFFER, 0);
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);

  7. #7
    Membre éclairé Avatar de AuraHxC
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2006
    Messages : 652
    Points : 683
    Points
    683
    Par défaut
    C'est un truc qu'il faut avoir l'habitude de faire avec les shaders et VBO etc... activer au moment tu en as besoin et désactiver quand tu as finis sinon on a des mauvaises surprises effectivement.

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 04/09/2006, 15h48
  2. [Dates] Problème avec date (heure qui varie)
    Par Death83 dans le forum Langage
    Réponses: 10
    Dernier message: 05/08/2006, 02h19
  3. Problème avec un div qui n'est pas pris en compte
    Par boss_gama dans le forum Général JavaScript
    Réponses: 11
    Dernier message: 25/07/2006, 16h32
  4. Réponses: 8
    Dernier message: 07/02/2006, 18h31
  5. Réponses: 3
    Dernier message: 16/09/2005, 10h01

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