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 :

VBO, optimiser la construction


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2009
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2009
    Messages : 70
    Par défaut VBO, optimiser la construction
    Bonjour tout le monde,

    Je commence à me sentir à l'aise avec les VBO, mais il me reste quelques zones de flous.

    Il s'agit de la manière de demander au matériel d'afficher la géométrie. Je sais qu'en mode direct, le fait de recourir a GL_QUAD_STRIP par rapport a GL_TRIANGLES est un gain certain et vérifié sur une machine standard.
    Mais avec l'utilisation des VBO, j'ai plusieurs fois entendu dire que ce n'est plus forcément vrai et c'est selon le matos.

    Il semblerait selon nvidia que la manière la plus optimisée sur leurs puces c'est d'utiliser GL_TRIANGLES pour les VBO, est ce vrai? Est ce vrai aussi avec une carte de type ATI?

    J'ai par exemple un terrain assez vaste que je rend en bande avec GL_QUAD_STRIP, donc j'ai fait chaque fois un IBO pour chaque bande. Moi ça me parait bien, mais je vois pas de différences avec GL_TRIANGLES et je sais pas vraiment comment voir si c'est top ou pas...

    Donc c'était pour avoir l'avis de certaines personnes qui ont déjà constaté certaines anomalies ou gains par rapport à une technique ou l'autre et s'ils veulent bien partager évidement .

    Je pense aussi aux objets qui sont stockés soit en triangles, soit en quads. Vaut-il mieux les convertir en triangles ou conserver?

    Voila merci.

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 157
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 157
    Billets dans le blog
    152
    Par défaut
    Bonjour,

    Il n'y a pas si longtemps que cela, nous avions parler sur le forum des différences entre GL_QUADS et GL_TRIANGLES. Techniquement, il n'y en que très peu, car un quad, c'est deux triangles.

    Après, votre comparaison est erronée, dans votre cas, il faudrait comparée un GL_QUAD_STRIP avec un GL_TRIANGLE_STRIP, et non un GL_TRIANGLES.

    De plus, je ne sais pas si c'est une bonne chose de faire des comparaisons de ce genre, vu que les quads et les triangles c'est presque pareille. Et puis pour rappel, dans OpenGL 3, ils ont viré les quads
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2009
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2009
    Messages : 70
    Par défaut
    Tout d'abord merci d'avoir pris le temps de lire mon message.

    Je ne savais pas que les quads étaient virés de la version 3, ce qui règle mon problème.

    Mais alors maintenant, je suppose que la question peut quand meme se poser entre GL_TRIANGLES et GL_TRIANGLE_STRIP en VBO?

    Je reprend mon exemple avec un terrain :
    En mode GL_TRIANGLE_STRIP, on crée un buffer pour les vertex, puis un buffer d'indice pour chaque bandes.
    En mode GL_TRIANGLES, tout pourrait se faire avec seulement deux buffer, mais il y aurait plus d'indices de construction.

    Mais pour le moment, je ne vois ni avantages ou inconvénients dans l'un ou l'autre mode. D'un coté on utilise moins de mémoire, car moins d'indice, mais on a plus de buffer a appeler. Tandis que l'autre c'est seulement deux buffers, mais avec beaucoup plus d'indices.

    J'arrive pas a me décider :s

  4. #4
    Membre chevronné
    Inscrit en
    Février 2008
    Messages
    413
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Février 2008
    Messages : 413
    Par défaut
    Salut,

    dans mon application j#ai aussi pas mal de Mesh à rendre, composés de beaucoup de triangles.

    Comme le dit LittleWhite, les QUADS tu peux laisser tomber: d'une part c'est déprécié (perso j'utilise max OpenGL 2.1, et ce encore pendant 1 ou 2 ans minimum, mais autant voir vers l'avant), et d'autre il y a toujours eu le fait que mathématiquement, 3 points sont toujours dans un plan, alors que 4 c'est pas gagné....donc si tu veux éviter d'avoir des artefacts et cie, reste sur les triangles.

    ensuite, je suis partisan d'une GL_TRIANGLE_STRIP plutôt que de GL_TRIANGLES: Tu envois beaucoup moins d'infos pour la même géométrie, c particulierement flagrant en mode direct....avec les VBOs peut être moins, c vrai.

    Le truc qui semble te poser problème, c'est d'avoir plusieurs listes d#indice....eh ben tu peux n'en avoir qu'une! => il est possible de "chainer" tes TRIANGLE_STRIP:
    mettons que tu as un mesh, tu dessines la 1ere ligne, puis arrivé "en haut a droite", tu "sautes" à la ligne suivante et recommence de la gauche.

    Un exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    1-----3-----5-----7
    |       |       |        |
    |       |       |        |
    2-----4-----6-----8
    |       |       |        |
    |       |       |        |
    9-----10----11----12
    Normalement, tu aurais 2 listes d'indices:
    Ligne 1: 1/2/3/4/5/6/7/8
    Ligne 2: 2/9/4/10/6/11/8/12

    Pour combiner, tu peux essayer ca: 1/2/3/4/5/6/7/8/8/2/2/9/4/10/6/11/8/12

    Donc en gros:
    - répeter le dernier point d'une ligne
    - repeter le 1er de la suivante

    L'explication c'est que:
    - on dessine (6/7/8)
    - Suivant: (7/8/8) => pas dessiné car 2 fois le meme point
    - Suivant: (8/8/2) => idem
    - Suivant: (8/2/2) => idem
    - Suivant: (2/2/9) => idem
    - Suivant: (2/9/4) => début de la 2eme ligne

    Voilà, à tester car là j'avoue me mélanger un peu avec les indices mais en tout cas c'est le principe, et ca marche, du coup un VBO avec tous tes points, presents une seule fois chacun, et une unique liste d'indices...

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2009
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2009
    Messages : 70
    Par défaut
    Ohh sympa l'idée.

    Je cherchais en vain de stopper un chainage sans stopper le flux d'indice. Merci beaucoup

    Ben je vais finalement convertir mon terrain GL_QUAD_STRIP en GL_TRIANGLE_STRIP, ce qui se fait relativement vite, mais je vais pouvoir virer tout mes buffers en trop du coup

  6. #6
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2009
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2009
    Messages : 70
    Par défaut
    En fait je viens de lire un article :
    http://hacksoflife.blogspot.com/2010...-to-strip.html
    qui pose les même problèmes.

    Mais le plus interessant, c'est qu'il m'a fait découvrir glEnable(PRIMITIVE_RESTART);
    Apparement c'est une extension nVIDIA qui est accepté dans OpenGL3 comme standard a en croire ma "quick reference card" et ça permet d'activer un "saut" pendant un long GL_TRIANGLE_STRIP pour un seul appel a glDrawElements();

    C'est la même solution que toi ShevchenKik, je pense?

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

Discussions similaires

  1. Construction optimisée d'une image à partir de petites images
    Par NiamorH dans le forum Traitement d'images
    Réponses: 4
    Dernier message: 12/11/2012, 17h16
  2. double optimisation VBO
    Par Lintel-oo dans le forum OpenGL
    Réponses: 6
    Dernier message: 09/02/2012, 23h27
  3. Optimisation et conseils [Aide VBO]
    Par baton dans le forum OpenGL
    Réponses: 49
    Dernier message: 21/10/2011, 15h07
  4. optimisations(vbo,display list) + bsp
    Par delfare dans le forum Développement 2D, 3D et Jeux
    Réponses: 2
    Dernier message: 07/03/2007, 09h34
  5. VBOs optimisation
    Par Omeyocan dans le forum OpenGL
    Réponses: 5
    Dernier message: 24/01/2006, 10h04

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