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 performance


Sujet :

OpenGL

  1. #1
    Membre chevronné Avatar de smartties
    Homme Profil pro
    Dev
    Inscrit en
    Février 2010
    Messages
    222
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Dev

    Informations forums :
    Inscription : Février 2010
    Messages : 222
    Par défaut Vertex array performance
    Salut, en ce moment je suis entrain de faire un petit moteur 3D basé sur opengl.
    Le moteur marche bien, mais j'ai un problème de performance avec les vertex array. J'ai fait plusieurs test et les vertex array s'affiche beaucoup plus vite mais de facon hasardeuse (dés fois sa sera 90fps et d'autre 15fps pour le même objet ).
    J'ai fait un test pour mesurer les performmances (en FPS) entre les vertex array et la facon native d'opengl ( glBegin(...);glVertex(...);glEnd(); )
    disponible a cette adresse la : http://smartties.netne.net/fgh.rar .
    (dans cette démo, l'application charge un .obj de 1mo, et qui a 15240 faces) Pouvez vous me dire si les vertex array s'affiche plus vite que les glVertex() ?

    ( laisser appuyer la touche " p " pour afficher l'objet en mode vertex array
    et " m " pour afficher l'objet en appelant les fonction glVertex();

    les Fraps par seconde son affiché dans le titre de la fenetre)

    Sachant que pour dessiner mon objet avec les vertex array je fais :

    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
    void ...::draw_array()
    {
     
    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_NORMAL_ARRAY);
     
           for(indice_face = 0; indice_face <= nb_face; indice_face++)
           {
           glVertexPointer(3, GL_FLOAT, 0, face[indice_face]->get_data_vertex());
           glNormalPointer(   GL_FLOAT, 0, face[indice_face]->get_data_normal());
     
           glDrawArrays(GL_POLYGON, 0, face[indice_face]->get_nb_vertex() );
           }
     
    glDisableClientState(GL_NORMAL_ARRAY);
    glDisableClientState(GL_VERTEX_ARRAY);
     
    }
    Merci

  2. #2
    Expert confirmé

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 033
    Billets dans le blog
    12
    Par défaut
    As-tu aussi pensé aux VBO ? Parce que ça devrait être plus rapide et ça t'éviterait d'utiliser des trucs obsolètes, surtout qu'au niveau de ton code il n'y aurait pas de trop grosses modifications à apporter, sachant que tu es déjà aux Vertex Arrays.
    Pour ton exe, je suis à 60 FPS en Vertex Array ou en Natif, donc ...
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  3. #3
    Membre chevronné Avatar de smartties
    Homme Profil pro
    Dev
    Inscrit en
    Février 2010
    Messages
    222
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Dev

    Informations forums :
    Inscription : Février 2010
    Messages : 222
    Par défaut
    Oui je vais implementer les vbo , mais c'était juste pour tester l'efficacité des vertex array.
    Sinon je voulais savoir si les VBO était compatible avec toutes les carte graphique ?

  4. #4
    Expert confirmé

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 033
    Billets dans le blog
    12
    Par défaut
    Euh, pas toutes, mais c'est supporté au moins depuis les Geforce FX (avant je ne sais pas, mais sur ma FX5600 c'était déjà supporté)
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  5. #5
    Invité
    Invité(e)
    Par défaut
    Non les VBO ne marchent pas bien sur toutes les Intel (aucune idée pour les vertex arrays) de plus tu as un bug dans ton code, si pour chaque face tu donnes un glVertexPointer et glNormalPointer ça ne risque pas d'améliorer les perfs.

  6. #6
    Membre très actif Avatar de oxyde356
    Homme Profil pro
    Ingénieur Recherche Imagerie
    Inscrit en
    Février 2006
    Messages
    797
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Recherche Imagerie

    Informations forums :
    Inscription : Février 2006
    Messages : 797
    Par défaut
    L'intérêt des vertex array c'est justement d'envoyer un tableau directement à la carte graphique et pas chaque sommet manuellement, toi tu as une utilisation des vertex array façon glBegin en envoyant chaque face. Bref aucun intérêt de l'utiliser de cette façon. Normalement tu set ton VertexPointer et NormalPointer une seule fois, tu dis combien il y a de points et le type de primitives et hop sa dessine tout d'un coup.
    Dans tous les cas je te conseil d'utiliser les VBO (à pars si tu veux modifier les points de ta géometrie en temps réel), si la carte graphique le permet et possède la mémoire nécessaire alors envoie tes données dans la ram graphique et utilise les VBO, s'ils ne sont pas supportés ou qu'il n'y a plus assez de ram graphiques alors stocke tes données dans un vertex array, après tout dépend de tes contraintes, performance, ou bien que ton moteur soit utilisable sur n'importe quelle machine même ancienne etc.

  7. #7
    Membre chevronné Avatar de smartties
    Homme Profil pro
    Dev
    Inscrit en
    Février 2010
    Messages
    222
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Dev

    Informations forums :
    Inscription : Février 2010
    Messages : 222
    Par défaut
    face[indice_face]->get_data_normal() renvoi un pointeur sur un tableau de normales de dimmension tab[nb_sommet * 3], ce qui me fait une normal par sommet.Ce n'est pas bon?
    D'ou vien le bug ?

  8. #8
    Membre chevronné Avatar de smartties
    Homme Profil pro
    Dev
    Inscrit en
    Février 2010
    Messages
    222
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Dev

    Informations forums :
    Inscription : Février 2010
    Messages : 222
    Par défaut
    Ah d'accord merci! je n'avais pas trop compris,comment utiliser les vertex array.
    Mais en utilisant 1 seul fois glVertexPointeur(); avec un tableau contenant toutes mes face, alors toutes mes faces seront relié ?

  9. #9
    Membre très actif Avatar de oxyde356
    Homme Profil pro
    Ingénieur Recherche Imagerie
    Inscrit en
    Février 2006
    Messages
    797
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Recherche Imagerie

    Informations forums :
    Inscription : Février 2006
    Messages : 797
    Par défaut
    Qu'appelle tu "face" dans ton programme ... ?

  10. #10
    Membre chevronné Avatar de smartties
    Homme Profil pro
    Dev
    Inscrit en
    Février 2010
    Messages
    222
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Dev

    Informations forums :
    Inscription : Février 2010
    Messages : 222
    Par défaut
    Dans mon programme une face contient un minimum de 3 points qui appartiennent au même plan.

  11. #11
    Membre chevronné
    Homme Profil pro
    Ingénieur 3D
    Inscrit en
    Avril 2008
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur 3D

    Informations forums :
    Inscription : Avril 2008
    Messages : 400
    Par défaut
    Citation Envoyé par oxyde356 Voir le message
    Dans tous les cas je te conseil d'utiliser les VBO (à pars si tu veux modifier les points de ta géometrie en temps réel)
    Même si on veut modifier la géométrie en temps réel, il vaut mieux passer en VBO et spécifier que le mesh sera dynamique. Ça permet d'unifier le code et de pas avoir 36 classes pour gérer différent types de géométrie. De plus, si la géométrie ne change pas a chaque frame, mais juste régulièrement, les perfs seront améliorées par rapport aux vertex arrays (le mesh sera stocké dans une partie spécifique de la RAM réservée pour le driver - l'aperture memory - qui est un poil plus rapide d’accès).

  12. #12
    Membre très actif Avatar de oxyde356
    Homme Profil pro
    Ingénieur Recherche Imagerie
    Inscrit en
    Février 2006
    Messages
    797
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Recherche Imagerie

    Informations forums :
    Inscription : Février 2006
    Messages : 797
    Par défaut
    Il ne me semble pas qu'il y en est depuis que les cartes sont en PCI et plus en AGP
    Tu as une source ? Bon après j'imagine que ça se débrouille avec la RAM quand même mais je ne trouve pas d'informations claires à ce sujet, si tu en as je suis preneur !

  13. #13
    Membre chevronné
    Homme Profil pro
    Ingénieur 3D
    Inscrit en
    Avril 2008
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur 3D

    Informations forums :
    Inscription : Avril 2008
    Messages : 400
    Par défaut
    Un de mes profs, mais bon, peut être qu'il était pas tout a fait a jour.
    Mais un petit coup de Google, et je tombe sur ca, donc on dirait que ça existe toujours.

  14. #14
    Membre très actif Avatar de oxyde356
    Homme Profil pro
    Ingénieur Recherche Imagerie
    Inscrit en
    Février 2006
    Messages
    797
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Recherche Imagerie

    Informations forums :
    Inscription : Février 2006
    Messages : 797
    Par défaut
    ça parle que d'AGP :s il n'y en a plus depuis un moment sur les cartes mères, de plus l'article ne m'a pas l'air daté En plus je crois que c'est vraiment variable selon les drivers donc pas fiable
    Bref dans le cas d'une géometrie vraiment dynamique je privilégierais les Vertex Arrays personnellement ^^

  15. #15
    Membre chevronné
    Homme Profil pro
    Ingénieur 3D
    Inscrit en
    Avril 2008
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur 3D

    Informations forums :
    Inscription : Avril 2008
    Messages : 400
    Par défaut
    En fait, je crois que je me suis un peu fait avoir par l'image de la GeForce 8800 en dessous, je pensais que ça permettrai de dater, mais c'est peut être juste une pub. A moins que tu considères la 8800 comme étant datée. Enfin bon, je m'y connais assez peu au niveau matos, donc bon...

    Mais sinon, si tu paramètres le VBO comme il faut, rien ne sera copié sur GPU et le comportement devrait être exactement le même qu'avec un Vertex Array (c'est pour ça que je les aime bien, les VBO ).

  16. #16
    Membre très actif Avatar de oxyde356
    Homme Profil pro
    Ingénieur Recherche Imagerie
    Inscrit en
    Février 2006
    Messages
    797
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Recherche Imagerie

    Informations forums :
    Inscription : Février 2006
    Messages : 797
    Par défaut
    Oui enfin qu'est ce que tu appelle paramétrer. Parce qu'apparemment rien n'est sûr au niveau du comportement (où sont stockées les données).

  17. #17
    Membre chevronné
    Homme Profil pro
    Ingénieur 3D
    Inscrit en
    Avril 2008
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur 3D

    Informations forums :
    Inscription : Avril 2008
    Messages : 400
    Par défaut
    Il est vrai que le comportement dépend grandement du driver. Mais normalement, il n'y a que le mode 'mise a jour du mesh de temps en temps' qui est vraiment flou et dépend du driver et de la mémoire dispo. Le mode complètement statique et complètement dynamique sont normalement relativement bien définis (mais il me semble qu'il y a toujours un peu d’interprétation de la part du driver). Ça se complique surtout quand on veut sortir du simple mode de dessin pour aussi lire dans les buffers, en fait.
    Personnellement, je fais plus confiance au driver (pour peu qu'il soit a jour) qu'a l'utilisateur quand il s'agit de décisions de très bas niveau (suffit de voir les horreurs de tutos qu'on trouve sur le net pour se faire une idée ).

  18. #18
    Membre très actif Avatar de oxyde356
    Homme Profil pro
    Ingénieur Recherche Imagerie
    Inscrit en
    Février 2006
    Messages
    797
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Recherche Imagerie

    Informations forums :
    Inscription : Février 2006
    Messages : 797
    Par défaut
    Oui et non les drivers (surtout ATI) ne sont pas une plaie mais un fléau. Je pense que je préférerai tout gérer à la mano. Pour les trucs dynamiques à chaque frame mais où il n'y a qu'une partie de la géometrie qui risque de bouger, VBO et une copie dans la ram puis subdata ou map pour mettre à jour. Et si c'est toute la géometrie qui bouge tout le temps alors vertex array je pense.

  19. #19
    Membre éprouvé Avatar de Robxley
    Homme Profil pro
    Docteur ingénieur traitement d'image
    Inscrit en
    Mai 2009
    Messages
    158
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Docteur ingénieur traitement d'image

    Informations forums :
    Inscription : Mai 2009
    Messages : 158
    Par défaut
    Salut, je me permets d'intervenir.

    Pour ma part j'opterai pour du VBO dans tous les cas. Pour la simple bonne raison que pour Opengl 3.x et 4 (et version future), les vertex arrays sont dépréciés, alors après je ne sais pas quelle version d'opengl vous utilisez. Mais malgré ça si vous tenez à jour vos pilotes de GPU, les pilotes seront tout de même optimisés pour les dernières versions d'Opengl (3.x et +) et donc optimisés pour l'ensemble des fonctionnalités non dépréciées.
    Bien que le maintient de la prise en charge des fonctions dépréciées tels que les vertex arrays durera encore un bout de temps, j'ai des doutes sur leur optimisation notamment du fait de la prise en charge par émulation coté driver des fonctions dépréciées....

    Après peut-être que je me trompe mais bon mieux vaut se plier aux exigences de son temps, si je puis dire.

  20. #20
    Membre très actif Avatar de oxyde356
    Homme Profil pro
    Ingénieur Recherche Imagerie
    Inscrit en
    Février 2006
    Messages
    797
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Recherche Imagerie

    Informations forums :
    Inscription : Février 2006
    Messages : 797
    Par défaut
    Bref tout dépend des contraintes de ton projet smartties, à toi de faire le bon choix ^^

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Performances OpenGL, Vertex Array, (VBO ?)
    Par Burckel dans le forum OpenGL
    Réponses: 6
    Dernier message: 07/03/2007, 10h40
  2. Vertex arrays
    Par goutbouyo dans le forum OpenGL
    Réponses: 9
    Dernier message: 06/01/2005, 13h11
  3. [SDL+glut] vertex array précompilés
    Par khayyam90 dans le forum OpenGL
    Réponses: 3
    Dernier message: 01/10/2004, 17h07
  4. vertex array
    Par Jbx 2.0b dans le forum OpenGL
    Réponses: 2
    Dernier message: 12/07/2004, 11h37
  5. 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