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 :

Rendu étrange avec les VBOs! Besoin d'aide


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 18
    Par défaut Rendu étrange avec les VBOs! Besoin d'aide
    Salut à tous!

    Je suis en train de développer un petit moteur et je me heurte à un sacré problème avec les VBOs.
    J'ai fais beaucoup de recherches sur ce forum et même sur le net mais je n'arrive pas à trouver ce qui ne colle pas.

    En fait je charge un fichier .3DS et je récupère les points de mon mesh.
    Ensuite je crée un tableau d'indices.
    J'ai vérifié le contenu des tableaux et tout semble ok.
    Pourtant, au rendu j'obtient n'importe quoi. Des triangles qui se forment n'importe comment.
    Pour mes test j'utilise un objet simple (une cube).

    Voici un morceau de mon code :

    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
    /* Initialisations */
    glGenBuffers(1, &bufPos);
    	glGenBuffers(1, &bufColor);
    	glGenBuffers(1, &bufIndex);
     
    	//Les positions des vertex
    	glBindBuffer(GL_ARRAY_BUFFER, bufPos);
    	glBufferData(GL_ARRAY_BUFFER, NB_VERTEX*SIZE_VERTEX*sizeof *posVertex, NULL, GL_STREAM_DRAW);
    	glBufferSubData(GL_ARRAY_BUFFER, 0, NB_VERTEX*SIZE_VERTEX*sizeof *posVertex, posVertex);
     
    	//Les couleurs
    	glBindBuffer(GL_ARRAY_BUFFER, bufColor);
    	glBufferData(GL_ARRAY_BUFFER, NB_VERTEX*SIZE_COLOR*sizeof *colorVertex, NULL, GL_STREAM_DRAW);
    	glBufferSubData(GL_ARRAY_BUFFER, 0, NB_VERTEX*SIZE_COLOR*sizeof *colorVertex, colorVertex);
     
    	//Les index
    	glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, bufIndex);
        glBufferData(GL_ELEMENT_ARRAY_BUFFER, NB_FACES*3*sizeof *indexVertex, NULL, GL_STREAM_DRAW);
        glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, NB_VERTEX*sizeof *indexVertex, indexVertex);
     
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
    glBindBuffer(GL_ARRAY_BUFFER, 0); //Plus de buffer a utiliser
    avec NB_VERTEX le nombre de vertex et SIZE_VERTEX le nombre de coordonnées (ici 3).

    Rendu:

    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
    glBindBuffer(GL_ARRAY_BUFFER, bufPos);
        glVertexPointer(SIZE_VERTEX, GL_FLOAT, 0, BUFFER_OFFSET(0));
     
    	glBindBuffer(GL_ARRAY_BUFFER, bufColor);
        glColorPointer(SIZE_COLOR, GL_UNSIGNED_BYTE, 0, BUFFER_OFFSET(0));
     
        /* activation des tableaux de sommets */
        glEnableClientState(GL_VERTEX_ARRAY);
        glEnableClientState(GL_COLOR_ARRAY);
     
    	glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, bufIndex);
    	glDrawElements(GL_TRIANGLES, NB_FACES*3, GL_UNSIGNED_INT, BUFFER_OFFSET(0)); //Dessine l'objet
    	glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
     
        /* desactivation des tableaux de sommet */
        glDisableClientState(GL_COLOR_ARRAY);
        glDisableClientState(GL_VERTEX_ARRAY);
    De plus, ce code ne fonctionne pas même quand je crée un tableau de points à la main ainsi que son tableau d'indices!!

    Avez-vous une idée d'où peut se trouver le hic?
    J'attends vos réponses avec impatience parce que là je ne m'en sors pas du tout.

    Merci beaucoup

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 18
    Par défaut
    Personne n'a une idée sur le problème?
    Je ne sais plus quoi faire, j'ai déjà essayé tout ce qui m'est venu à l'esprit.
    Si vous avez eu ce problème et que vous avez réussi à le résoudre pouvez-vous me dire d'où ca vient?
    Encore merci!!

  3. #3
    Yno
    Yno est déconnecté
    Membre éprouvé Avatar de Yno
    Inscrit en
    Novembre 2005
    Messages
    138
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 138
    Par défaut
    Salut,

    Tout semble bon effectivement, il y a cependant quelque chose qui me titille : pourquoi tu utilises de temps en temps NB_VERTEX et d'autres fois NB_FACES*3 ? Essayes déjà d'être cohérent dans ce que tu fais, et utilises soit l'un soit l'autre (je pencherais personnellement pour le premier).
    Peut-on avoir un screen du résultat que tu obtiens ?

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 18
    Par défaut
    Nan, c'est tout à fait normal!
    Comme j'utilise les index, les sommets ne sont pas dupliqués, ce qui signifie qu'un sommet peut être utilisé plusieurs fois.
    Par exemple, vois les tableaux de sommets et d'indices que j'obtiens en chargeant un plan depuis mon fichier 3DS :

    vertex :
    -5, -5, 0,
    5, -5, 0,
    -5, 5, 0,
    5, 5, 0

    Indices :
    0, 3, 9,
    9, 6, 0

    Donc pour 2 faces (ici des triangles), j'ai 4 vertex (d'ou NB_VERTEX qui correspond au nombre de sommets et NB_FACES*3 qui correspond au nombre d'indices)

    Voilà! Si tu as une autre idée à laquelle je n'aurai pas pensé je serai preneur

  5. #5
    Yno
    Yno est déconnecté
    Membre éprouvé Avatar de Yno
    Inscrit en
    Novembre 2005
    Messages
    138
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 138
    Par défaut
    Citation Envoyé par kaliban Voir le message
    Nan, c'est tout à fait normal!
    Comme j'utilise les index, les sommets ne sont pas dupliqués, ce qui signifie qu'un sommet peut être utilisé plusieurs fois.
    Par exemple, vois les tableaux de sommets et d'indices que j'obtiens en chargeant un plan depuis mon fichier 3DS :

    vertex :
    -5, -5, 0,
    5, -5, 0,
    -5, 5, 0,
    5, 5, 0

    Indices :
    0, 3, 9,
    9, 6, 0

    Donc pour 2 faces (ici des triangles), j'ai 4 vertex (d'ou NB_VERTEX qui correspond au nombre de sommets et NB_FACES*3 qui correspond au nombre d'indices)
    Ah oui, c'est vrai
    *va se cacher*

    Citation Envoyé par kaliban Voir le message
    Voilà! Si tu as une autre idée à laquelle je n'aurai pas pensé je serai preneur
    Citation Envoyé par Yno
    Peut-on avoir un screen du résultat que tu obtiens ?

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 18
    Par défaut
    Oui bien sûr, je vous met un screen dès ce soir (la je suis au boulot )!
    Quand je veux afficher un plan, l'écran est noir.
    Enfin, en fait il n'est pas vraiment vide, je vois comme une ligne qui scintille lorsque je lui applique un rotate (mais elle est très très peu visible).
    Quand je veux afficher un cube ou une théière, les triangles sont placés n'importe comment!
    J'ai essayé de changer des valeurs, de recréer mes listes... mais rien y fait (au mieu mes triangles sont la (tous je sais pas)n et au pire mon écran est vide).
    Vous verrez mieu de visu ce soir de quoi je parle!

    Mais n'hésitez pas à poster, que je teste tout ca en arrivant! hihi

    Allez, courage pour la journée pour les bosseurs, et peut-être bonne rentrée scolaire pour d'autres

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 18
    Par défaut
    Ah oui, j'ai oublié de vous préciser!
    Ce n'est pas un problème de matériel puisque lorsque j'ai implémenté les VBOs tout au début, j'ai fait une petit tableau de 9 valeurs (3 vertex) que j'affichais parfaitement bien avec glDrawArray (donc pas encor d'indexes).
    Mais pour la petite info, j'ai une nv 7600 (GO car c'est un portable).

    voila, voila!!
    Toujours dans l'attente de THE solution

  8. #8
    Yno
    Yno est déconnecté
    Membre éprouvé Avatar de Yno
    Inscrit en
    Novembre 2005
    Messages
    138
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 138
    Par défaut
    Tes matrices de projection/visualisation sont elles biens configurées ? Es-tu sûr que ton loader est fiable ?

    Ensuite je crée un tableau d'indices.
    Tu veux dire que tu localises et élimine les sommets doublons c'est bien ça ?

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 18
    Par défaut
    Tout est très bien configuré!
    De plus, en ce qui concerne mon loader il est très fiable (lib3ds) car il me restitue les tableaux que je vous ai posté plus haut (et les valeurs sont correctes comme on peut le voir).

    Voici quelques screens que j'ai fait :
    le plan (les pointillés sont peu visible mais en réalité forment plus ou moins une ligne, au lieu d'un plan biensûr) :

    ->Et je le regarde de face hein, pas de coté :p

    Un cube (normalement) :


    Et enfin une théière :


    Donc voila les quelques rendu que j'obtiens!
    Tout est bien configuré puisque j'ai des rendus

    Allez, j'attends vos idées
    Images attachées Images attachées    

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 18
    Par défaut
    Olala!!
    Je pense avoir trouvé ma connerie!

    J'ai comme l'impression d'avoir omis ces 2 lignes :
    glIndexPointer(GL_UNSIGNED_INT, 0, BUFFER_OFFSET(0));
    glEnableClientState(GL_INDEX_ARRAY);

    Je vais essayer ca dès ce soir mais je pense que ca doit venir de la!
    Il m'aura quand même fallu 3 jours pour m'apercevoir de ce manque.
    On a le code sous les yeux, on a beau le lire et le relire une cinquantaine de fois et ca crève les yeux.

    Enfin, je vous averti dès ce soir du succès ou non de l'opération

    A tout à l'heure tout le monde...

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 18
    Par défaut
    Bon ben voila, j'ai enfin testé!
    J'erreur ne venait pas de ca. Cependant, j'ai réussi à trouver ce qui clochait.

    Regardez ces tableaux:
    vertex :
    -5, -5, 0,
    5, -5, 0,
    -5, 5, 0,
    5, 5, 0

    Indices :
    0, 3, 9,
    9, 6, 0

    Et ben les indices sont faux en fait!
    ->Les indices sont multipliés par 3.
    C'est moi qui ai fait ca car je croyait qu'il fallait indiquer la place de la première valeur des coordonnées d'un vertex, or, il faut tout simplement indiquer sa position (sans tenir compte du nombre de valeurs pour un vertex).
    Donc les valeurs correctes sont celles-ci :
    0, 1, 3,
    3, 2, 0

    Ainsi, tout fonctionne parfaitement.
    En tout cas je remercie Yno de s'être penché sur le problème
    Je clos cette discussion puisque j'ai ma solution.

    A très bientôt en tout cas!
    Bye

  12. #12
    Yno
    Yno est déconnecté
    Membre éprouvé Avatar de Yno
    Inscrit en
    Novembre 2005
    Messages
    138
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 138
    Par défaut
    Bonne nouvelle

    Citation Envoyé par kaliban Voir le message
    J'ai comme l'impression d'avoir omis ces 2 lignes :
    glIndexPointer(GL_UNSIGNED_INT, 0, BUFFER_OFFSET(0));
    glEnableClientState(GL_INDEX_ARRAY);
    Effectivement le problème ne pouvait pas venir de là : index représente ici les couleurs indexées, et non les indices de sommets.

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

Discussions similaires

  1. Multi texture dans avec les VBO
    Par yvesall dans le forum OpenGL
    Réponses: 5
    Dernier message: 28/04/2009, 01h05
  2. connexion ado avec acces et besoin d'aide pour code vb svp
    Par essse dans le forum Visual Studio
    Réponses: 0
    Dernier message: 06/03/2009, 09h57
  3. Comportement étrange avec les index et "order by"
    Par Dia_FR dans le forum Requêtes
    Réponses: 5
    Dernier message: 18/08/2008, 09h18
  4. Une chose étrange avec les Sub
    Par supertoms dans le forum VBA Access
    Réponses: 5
    Dernier message: 28/04/2008, 19h02
  5. Résultat étrange avec les lumières.
    Par MaxPayne dans le forum OpenGL
    Réponses: 4
    Dernier message: 12/04/2005, 18h04

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