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 normales


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 99
    Par défaut Vertex Array et normales
    Bonjour,

    j'ai besoin d'afficher des maillages conséquent. Apres avoir coder en display list qui marche nikel, je voudrais optimiser avec des "vertex array" au sens d'opengl.
    Probleme, le tableau referençant les normales est différent de celui referencant les vertex. car un vertex donné a plusieurs normales en fonction du triangle considéré dans le maillage... donc pour optimiser la taille de mes tableaux, j'ai fait deux index.
    Quelqu'un a t il une solution pour separer l'indexation des vertex et des normales dans un "vertex array" ?

  2. #2
    Expert confirmé
    Avatar de djo.mos
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    4 666
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 4 666
    Par défaut
    Je ne te suis plus là ! apparament, tu utilises le per-face normal, chose anarchique, moche ...
    Utilises plutôt le per-vertex normal : la normale de chaque vertex est la moyenne des normales des faces auxelles ce vertex appartient. Ca devrait aider.

  3. #3
    Membre éprouvé
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 125
    Par défaut
    L'incovénient de cette technique (pour avoir essayé), c'est qu'on ne peut pas modéliser des objets carrés. Le gouraud shading, c'est bien pour les sphères mais ça arrive aussi qu'on veuille dessiner des trucs anguleux....

  4. #4
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 99
    Par défaut
    je suis d'accord avec Omfraax, et c tout a fait mon probleme...
    Si je moyenne les normales d'un meme vertex, ca chie completement avec les vertex situés sur un angle.
    S'il n'y a pas moyen de gérer deux index, un pour les vertex, l'autre pour les normales associées, j'ai opté pour une autre technique consistant à moyenner les normales par face (ce qui esquive le probleme des angles), mais je me retrouve avec un tableau de normale et de vertex avec des normales et vertex répétées plusieurs fois(pas tres optimale) ...
    Enfin, ca marche, mais c pas ce que je voulais faire...
    L'idéal, dans un monde opengl parfait, avoir un index pour les normales, un index pour les vertex et c parti mon kiki !!!
    Est possible ?
    Merci messieurs, ou mesdames pour votre interet a cette question à 0€ !
    Bonne journée

  5. #5
    Membre Expert
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 580
    Par défaut
    1 tableau contenant les vertex -> 3 glfloat par vertex
    1 autre contenant les normales -> 3 glfloat par vertex
    1 troisième contenant les faces -> 6 index (gluint par exemple) par face, 3 pour les vertex, 3 pour les normales

    c'est ce que permet glInterleavedArray non ?

    les normales sont par vertex, pas forcément la moyenne des normales des faces auquelles le vertex appartient, c'est toi qui les défini
    cette méthode permet tout type de rendu, cube sphère ect sans multiplier les normales ou les vertex
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  6. #6
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 99
    Par défaut
    Merci, mais il me semblais que glInterleavedArray ne fonctionnait pas avec toutes les cartes graphiques...
    Si je me fourre le doigt dans l'oeil, alors tant mieux, je surferais sur cette piste !!!

  7. #7
    Membre Expert
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 580
    Par défaut
    je ne pense pas qu'il y ait de limitation pour glInterleavedArray
    ce n'est pas une extension et, sauf erreur de ma part, elle est présente depuis OpenGL 1.1
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  8. #8
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 99
    Par défaut
    OK merci beaucoup pour ces renseignements, je me mets au boulot de suite !!!

  9. #9
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 99
    Par défaut Vertex Array et normales
    En fait le probleme de mes normales indexées n'est toujours pas résolu avec glInterleavedArrays qui n'apporte rien; sauf de pouvoir ranger en contigue les normales et les vertex. Rien a voir avec ce que je voudrais en fait !!!
    Je repete ma question un peu plus clair :
    - j'ai un tableau avec mes normales en float
    - un tableau indexant (uint) ces normales, car pour un vertex donné, je n'ai pas forcément la meme normale (vertex en angle)
    - un tableau de vertex en float
    - un tableau indexant (uint) ces vertex par triangle

    Et voila, je voudrais afficher tout ca en utilisant les vertex array. Cette structure est la plus optimale, car aucun doublon de normale ou vertex (en float) en memoire.
    Y'a t'il une solution ?
    Désolé d'insister, mais j'ai des contraintes memoires assez conséquentes, vu que j'affiche des milliers d'objets, constitués de milliers de triangles. (Modeleur / Loader 3D)
    Merci, bon aprem a vous.

    fusionné par khayyam90

  10. #10
    Membre Expert
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 580
    Par défaut Re: Vertex Array et normales
    Citation Envoyé par jcloupgarou
    - j'ai un tableau avec mes normales en float
    - un tableau indexant (uint) ces normales, car pour un vertex donné, je n'ai pas forcément la meme normale (vertex en angle)
    - un tableau de vertex en float
    - un tableau indexant (uint) ces vertex par triangle
    Tu peux regrouper tes 2 tableaux d'index pour justement utiliser glInterleavedArray
    Si ton tableau indexant tes normales contient les normales par triangle c'est facile, sinon cela demande un peu plus de travail
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  11. #11
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 99
    Par défaut
    le probleme, c que glInterleavedArray utilise un tableau de float contenant les trois coordonnées de normales et les trois coordonnées de vertex pour un triangles donnés (GL_N3F_V3F). Ce qui signifie qu'il n'y a plus de notions d'index...
    j'ai effectivement un tableau indexant les normales par triangles !
    - le tableau de normale :
    ( normale1X, normale1Y, normale1Z,
    ......
    normaleiX, normaleiY, normaleiZ,
    ..... )

    - le tableau de vertex :
    ( vertex1X, vertex1Y, vertexiZ,
    .............
    vertexiX, vertexiY, vertexiZ,
    ...........
    )

    - le tableau d'index :
    ( triangle1 : indicNormale1 indicNormale2 indicNormale3
    indicVertex1 indicVertex2 indicVertex3,
    ->les trois sommets du triangle 1
    .....
    trianglei : indicNormale1 indicNormale2 indicNormale3
    indicVertex1 indicVertex2 indicVertex3,
    ->les trois sommets du triangle i
    ......)

    glInterleavedArray ne prend pas un tableau d'index mais un tableau de float en reference.... Apparemment... J'ai essayé de le coder, et ca se confirme...
    Quest ce que tu en penses ? Merci.

  12. #12
    Membre Expert
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 580
    Par défaut
    je me suis un peu embrouillé, désolé, on remet tout à plat par rapport à tes explications :
    -glVertexPointer pour définir ton tableau de float contenan tes vertex
    -glNormalPointer pour définir ton tableau de float contenant tes normales
    -faire un appel à glEnableClientState pour activer les tableaux (voir les docs correspondantes)
    -glDrawElements pour lancer le rendu, tu passes ta liste d'indices
    -faire appel à glDisableClientState pour désactiver les tableaux
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  13. #13
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 99
    Par défaut
    glEnableClientState(GL_NORMAL_ARRAY);
    glEnableClientState(GL_VERTEX_ARRAY);

    glNormalPointer(GL_FLOAT, 0, &occGeometry->normaleArray[0]);
    glVertexPointer(3, GL_FLOAT, 0, &occGeometry->vertexArray[0]);

    glDrawElements(GL_TRIANGLES, occGeometry->indexArray.size() , GL_UNSIGNED_INT, &occGeometry->indexArray[0]);

    glDisableClientState(GL_NORMAL_ARRAY);
    glDisableClientState(GL_VERTEX_ARRAY);

    Voici le code que j'ai ecrit qui marche tres bien, mais qui n'est pas optimal... indexArray ne reference que les vertex. Hors je n'ai pas qu'une seule normale par vertex (cas ou les vertex sont sur une arete anguleuse). Ce code concidere qu'il faut la meme organisation pour l'indexation des normales, ce qui entraine un nombre important de doublon dans le tableau de normales.
    D'ou ma question qui serait d'utilisé deux index, un pour les vertex et un pour les normales... Mais apparemment c pas possible...

  14. #14
    Membre Expert
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 580
    Par défaut
    j'ai fouillé la doc OpenGL et le net pour trouver des exemples sans succès
    même les VBO ne semblent pas permettre ce que j'ai toujours fait mais avec des appels à glVertex glNormal ...

    si je prend pour exemple un cube
    Vertex : 1 tableau de 8 coordonnées de 3 float
    Normales : 1 tableau de 6 coordonnées de 3 float
    Indices : 1 tableau de 12 fois 6 GLuint (12 triangles, 3 indices pour les vertex, 3 pour les normales)

    VertexArray -> impossible ?
    VBO -> impossible ?
    DisplayList -> oui, mais c'est vachement limité, à tester

    je ne m'étais pas penché sur le problème jusqu'à maintenant puisque je pensai que c'était possible
    je n'avais jamais utilisé glInterleavedArray (et du coup je t'ai dis des conneries )

    j'y crois pas, il doit y avoir une solution
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  15. #15
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 99
    Par défaut
    J'ai encore un peu optimiser le delire !
    J'ai la chance de connaitre les faces de mon objets 3D (face = listes de triangles délimité par un edge). Je peux donc deja moyenner mes normales en restant dans une face donnée, ce qui esquive le probleme des vertex d'angle. Je gagne un peu de memoire pour mes tableaux, mais on trouve toujours des doublons : les vertex d'angle qui ont plusieurs normales différentes en fonction de la face concidérée sont répétés dans le tableau, et les normales de ces vertex sont elles aussi repétées meme si elles étaient deja presentes dans le tableau de normales...

    En utilisant les display liste, je pouvais avoir les deux tableaux d'index, pour les normales et pour les faces, et tracer mes triangles à grands coup de glBegin(GLTriangles), mais je m'étais dis que coder en "vertex array" serait encore plus optimale...
    Je ne sais plus trop maintenant avec cette contrainte, peut-etre vais-je revenir à un modele display list et laisser tomber le vertex array...
    Merci pour ton aide, si t'as des infos plus précises, hésite pas !!! ;o)

  16. #16
    Membre Expert
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 580
    Par défaut
    jusqu'à maintenant je m'étais toujours cantonné aux DisplayList en me disant que je passerai aux VertexArray ou VBO lorsque j'aurai besoin de plus de performances

    j'espère que quelqu'un aura une solution à apporter parceque je trouve cela dommage de devoir conserver des doublons de Vertex, Normales ou TexCoords
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  17. #17
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 99
    Par défaut
    J'ai fait des tests en chargeant des gros objets 3D avec plusieurs milliers de triangles dans mon modeleur. Le resultat est sans appel : Avec les listes d'affichages, j'ai un gain conséquent en mémoire par rapport au "vertex array".
    Cela dit je n'ai pas testé avec les VBO, peut-etre que les excés de mémoires (doublons), sont nivelés par le fait que tout est chargé directement dans la CG. A voir !

  18. #18
    Membre éprouvé
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 125
    Par défaut
    Et ben n'empeche, c'est compliqué de tracer un objet quelconque à la fois rond et carré. Et encore, t'as pas essayé les textures, ça amène encore plus de galère...

Discussions similaires

  1. Vertex arrays
    Par goutbouyo dans le forum OpenGL
    Réponses: 9
    Dernier message: 06/01/2005, 13h11
  2. [SDL+glut] vertex array précompilés
    Par khayyam90 dans le forum OpenGL
    Réponses: 3
    Dernier message: 01/10/2004, 17h07
  3. vertex array
    Par Jbx 2.0b dans le forum OpenGL
    Réponses: 2
    Dernier message: 12/07/2004, 11h37
  4. Performance des vertex array
    Par Mathieu.J dans le forum OpenGL
    Réponses: 13
    Dernier message: 25/06/2004, 10h47

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