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 :

vertex array et std::vector marche pas, help!


Sujet :

OpenGL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    28
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2007
    Messages : 28
    Points : 12
    Points
    12
    Par défaut vertex array et std::vector marche pas, help!
    Hello!

    J'ai les trois std::vector suivant:

    vertex, contenant les coordonnées (float x,y,z) des vertices
    face, contenant les 3 indices (GLint) des vertices (structure a,b,c)
    normal, contenant les normales (float x,y,z)
    ..

    J'ai testé avec glDrawArray(GL_POINT, ...) en liant les pointeurs GL_VERTEX_ARRAY et GL_NORMAL array vers les std::vector correspondant et ça... ça marche bien.

    Je voudrais maintenant afficher les face en utilisant le vector face comme liste d'indices...

    avec glDrawElements(GL_TRIANGLES, face.size(), GL_INT, &face[0]);

    mais ça, ça marche pas ... rien ne s'affiche.

    Pourquoi?

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    28
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2007
    Messages : 28
    Points : 12
    Points
    12
    Par défaut
    Voilà le code de la fonction de dessin ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    void Mesh::Draw(){
     
            glEnableClientState(GL_VERTEX_ARRAY);
            glEnableClientState(GL_NORMAL_ARRAY);
            glVertexPointer(3, GL_FLOAT, 0, &vertex[0]);
            glNormalPointer(GL_FLOAT, 0, &normal[0]);
            glColor4f(1.0,1.0,1.0,1.0);
     
            glDrawElements(GL_TRIANGLES, face.size(), GL_INT, &face[0]);
     
            glDisableClientState(GL_VERTEX_ARRAY);
            glDisableClientState(GL_NORMAL_ARRAY); }

  3. #3
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Faudrait pas aussi activer GL_INDEX_ARRAY avec glEnableClientState ?

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    28
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2007
    Messages : 28
    Points : 12
    Points
    12
    Par défaut pas mieux...
    J'ai testé, ça ne marche pas mieux...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    glEnableClientState(GL_VERTEX_ARRAY);
            glEnableClientState(GL_NORMAL_ARRAY);
            glEnableClientState(GL_INDEX_ARRAY);
            glVertexPointer(3, GL_FLOAT, 0, &vertex[0]);
            glNormalPointer(GL_FLOAT, 0, &normal[0]);
            glPointSize(2.0);
            glColor4f(1.0,1.0,1.0,1.0);
            //glDrawArrays(GL_POINTS, 0, vertex.size()); <-- ça, ça marche...
            glDrawElements(GL_TRIANGLES, sizeof(GLint)*3*face.size(), GL_INT, &face[0]);
            glDisableClientState(GL_VERTEX_ARRAY);
            glDisableClientState(GL_NORMAL_ARRAY);
            glDisableClientState(GL_INDEX_ARRAY);

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    28
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2007
    Messages : 28
    Points : 12
    Points
    12
    Par défaut autre test
    J'ai testé avec la méthode classique:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    glBegin(GL_TRIANGLES);
            for(int i=0; i<face.size(); i++)
            {
              glNormal3f(normal.at(face.at(i).a).x, normal.at(face.at(i).a).y, normal.at(face.at(i).a).z);
              glVertex3f(vertex.at(face.at(i).a).x, vertex.at(face.at(i).a).y, vertex.at(face.at(i).a).z);
              glNormal3f(normal.at(face.at(i).b).x, normal.at(face.at(i).b).y, normal.at(face.at(i).b).z);
              glVertex3f(vertex.at(face.at(i).b).x, vertex.at(face.at(i).b).y, vertex.at(face.at(i).b).z);
              glNormal3f(normal.at(face.at(i).c).x, normal.at(face.at(i).c).y, normal.at(face.at(i).c).z);
              glVertex3f(vertex.at(face.at(i).c).x, vertex.at(face.at(i).c).y, vertex.at(face.at(i).c).z);
            }
           glEnd();
    et ça marche.
    Une idée pourquoi l'autre méthode ne marche pas?

  6. #6
    Rédacteur
    Avatar de bafman
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    2 574
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2003
    Messages : 2 574
    Points : 5 323
    Points
    5 323
    Par défaut
    pourquoi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sizeof(GLint)*3*face.size()
    sachant que face est ton tableau d'indices, il n'y a pas besoin du 3 non ?
    * Il est infiniment plus simple de faire rapidement un code qui marche que de faire un code rapide qui marche
    * pour faciliter les recherches, n'oubliez pas de voter pour les réponses pertinentes
    Mes articles

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    28
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2007
    Messages : 28
    Points : 12
    Points
    12
    Par défaut 3...
    3 parce que le tableau est un vector de structure Face

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    struct Face{
    GLint a; 
    GLint b; 
    GLint c;
    }
    donc 3 GLint par entrée du vecteur... d'où le x3.

  8. #8
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Points : 2 640
    Points
    2 640
    Par défaut
    Citation Envoyé par filoo
    Voilà le code de la fonction de dessin ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    void Mesh::Draw(){
     
            glEnableClientState(GL_VERTEX_ARRAY);
            glEnableClientState(GL_NORMAL_ARRAY);
            glVertexPointer(3, GL_FLOAT, 0, &vertex[0]);
            glNormalPointer(GL_FLOAT, 0, &normal[0]);
            glColor4f(1.0,1.0,1.0,1.0);
     
            glDrawElements(GL_TRIANGLES, face.size(), GL_INT, &face[0]);
     
            glDisableClientState(GL_VERTEX_ARRAY);
            glDisableClientState(GL_NORMAL_ARRAY); }
    glDrawElements(GL_TRIANGLES, face.size(), GL_INT, &face[0]);
    Qu'est-ce que face.size () renvoit ? Le nombre de faces ou le nombre de vertices ? Car c'est le nombre de vertices qui doit être mis ici, donc face.size() * 3, et ce n'est pas un pointeur vers le première élément de face qui doit être envoyé mais de vertex.

    EDIT : j'ai supprimé la fin, je crois que j'ai dit des bêtises après :p

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    28
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2007
    Messages : 28
    Points : 12
    Points
    12
    Par défaut
    Auto-trouvé! Ca marche finalement ...

    L'erreur était dans le type de données attribuées dans glDrawElement

    à savoir qu'il devait être du type GL_UNSIGNED_INT et pas GL_INT.

    Voilà le résultat.



    PS: c'est bien un pointeur vers l'array d'index qu'il faut passer à la fin de l'appel à glDrawElement.

    Merci du coup de main!
    Images attachées Images attachées  

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 366
    Points : 440
    Points
    440
    Par défaut
    je trouve personnellement dangereux d utiliser un vector<face> et de faire comme si &v[0] te retournait un entier.

    Effectivement, il y a de bonne chance que pour v[0] et le premier entier aient bien la meme addresse. En revanche, tu n est a priori pas sur que le compilateur ne rajoutra pas des octets superflux pour l alignement (padding) a la fin du 3eme indice ("c") dans ta structure.

    question subsidiaire : est ce que quelqu'un sait si la consigne de compilation

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #pragma pack est portable

  11. #11
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Aucun #pragma n'est portable, puisqu'ils servent par définition à implémenter des trucs spécifiques aux compilos.

    Par contre j'ai un jour croisé des en-têtes pour ça :
    <pshpack1.h>
    <pshpack8.h>
    ...
    <poppack.h>

    Par contre je pense que ça ne fonctionne que sous Windows. Si tu veux un truc complétement portable, il faut te palucher les directives particulières de tous les compilos.

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 366
    Points : 440
    Points
    440
    Par défaut
    c est bien ce que je pensais ....

    conclusion : utiliser un tableau de structures qui contiennent 3 int , n est pas equivalent a utiliser un tableau de int.

  13. #13
    Yno
    Yno est déconnecté
    Membre habitué Avatar de Yno
    Inscrit en
    Novembre 2005
    Messages
    138
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 138
    Points : 141
    Points
    141
    Par défaut
    Citation Envoyé par Laurent Gomila
    Faudrait pas aussi activer GL_INDEX_ARRAY avec glEnableClientState ?
    Les tableaux d'indices ne s'activent pas. GL_INDEX_ARRAY représente les couleurs indexées (faudra corriger ça dans le Yes::Engine ).

    « Les tableaux d'indices doivent êtres des tableaux d'entiers non signés. Et c'est important, sinon ça ne fonctionne pas »

    EDIT :
    à savoir qu'il devait être du type GL_UNSIGNED_INT et pas GL_INT.
    Eh ben, oui

  14. #14
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Citation Envoyé par Yno
    Les tableaux d'indices ne s'activent pas. GL_INDEX_ARRAY représente les couleurs indexées (faudra corriger ça dans le Yes::Engine ).
    Arg, je me fais toujours avoir avec ça
    Ils auraient pu caser le mot COLOR dans leurs constantes désignant les couleurs indicées.

  15. #15
    Rédacteur
    Avatar de bafman
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    2 574
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2003
    Messages : 2 574
    Points : 5 323
    Points
    5 323
    Par défaut
    Citation Envoyé par Laurent Gomila
    Arg, je me fais toujours avoir avec ça
    Ils auraient pu caser le mot COLOR dans leurs constantes désignant les couleurs indicées.
    c'est sûre que c'est piegeant comme truc, mais il faut savoir que les couleur indexé date d'openGL 1.0 alors que les vertex array date du 1.1, donc à l'epoque d'openGL 1.0, le seul truc qui pouvait être indexé, c'etait les couleurs
    * Il est infiniment plus simple de faire rapidement un code qui marche que de faire un code rapide qui marche
    * pour faciliter les recherches, n'oubliez pas de voter pour les réponses pertinentes
    Mes articles

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

Discussions similaires

  1. Wrapper std::vector ou pas ?
    Par Agoudard dans le forum C++
    Réponses: 9
    Dernier message: 19/01/2011, 02h21
  2. [CS3] Validation formulaire ne marche pas..help
    Par pgu64 dans le forum Dreamweaver
    Réponses: 3
    Dernier message: 15/04/2008, 15h04
  3. std::nothrow ne marche pas !
    Par uriotcea dans le forum SL & STL
    Réponses: 3
    Dernier message: 15/02/2007, 12h53
  4. la fonction is_file et is_dir ne marche pas, HELP !!!
    Par chaser_T dans le forum Langage
    Réponses: 5
    Dernier message: 17/03/2006, 10h54
  5. std ::vector [erreur que je ne comprend pas]
    Par aaronw dans le forum SL & STL
    Réponses: 8
    Dernier message: 05/03/2006, 21h00

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