Vertex buffer object à systématiser ? [Résolu]

Signaler
Messages postés
112
Date d'inscription
dimanche 6 juin 2004
Statut
Membre
Dernière intervention
19 septembre 2007
-
Messages postés
112
Date d'inscription
dimanche 6 juin 2004
Statut
Membre
Dernière intervention
19 septembre 2007
-
Bonjour à tous, je fais un programme en openGL et je voulais savoir si il vaut mieux systématiser l'utilisation des vertex buffer object ou bien s'il faut les réserver seulement pour les maillages importants. En effet, lorsqu'il faut dessiner seulement deux pauvres triangles, vaut-il mieux utiliser glBegin(GL_TRIANGLES); ou bien créer des buffer de vertex, textures et normales...
Merci

Vince

15 réponses

Messages postés
573
Date d'inscription
samedi 16 novembre 2002
Statut
Membre
Dernière intervention
9 avril 2008
1
Tout dépend des performances requises.
Pour les meilleures performances, il faut charger un max de données dans la carte vidéo à l'initialisation (textures, vertex buffers, index buffers, shaders), puis le programme principal n'aura qu'a donné des ordres à la carte vidéo.

Si tu crées, remplis puis envoies les vertex et index buffer à chaque boucle (glBegin(GL_TRIANGLES)) c'est sûr que ça tournera moins vite.
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
Non je suis pas du tout d'accord. Il faut minimiser le nombre d'appel
de fonction a l'api. Donc hors de question d'afficher un carré un par
un a des positions différentes en modifiant la matrice (avec en plus
une masse de calcul supplémentaire). Tu remplis un buffer avec le
nombre de carré que tu veux à la position souhaité et tu affiches tout
avec un seul appel de fonction.
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
Je suis pas d'accord :) Si les carrés bougent, il remet a jour le buffer.
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
Ben en fait eplanet c'est toute la question. Qu'est ce qui est le plus
rentable. Mais dans le cas présent, on peut pas se permettre de faire
1000 (ou plus) appel a glDrawElement suivis de glTranslatef. Car a
chaque appel de fonction, le CPU et GPU doivent se synchroniser. En
bref, il me semble que le parallèlisme est bien meilleur, en remettant
a jour une bonne fois le buffer et en laissant le GPU bosser tout seul
dans son coin.


Apres, tu peux aussi jouer avec les options STATIC, DYNAMIC des vbos.
Ou tu peux aussi essayer les vertex array classique, mais faut balancer
l'intégralité des vertex a chaque frame la, meme si rien n'a changé.
Messages postés
112
Date d'inscription
dimanche 6 juin 2004
Statut
Membre
Dernière intervention
19 septembre 2007

Ok je te remercie, je vais essayer de remplacer tout mes glBegin(GL_TRIANGLES); alors. Sinon deuxième question : j'ai un même carré à afficher plusieurs (beaucoup de) fois mais à des positions différentes, est-ce qu'il vaut mieux faire des buffers pour un seul des carré et ensuite afficher plusieurs fois ce carré avec des glTranslatef et glRotatef ou bien est-ce qu'il vaux mieux dupliquer le carré plusieurs fois dans le buffer (en changeant les positions) et n'afficher qu'une fois le buffer obtenu ?

Vince
Messages postés
573
Date d'inscription
samedi 16 novembre 2002
Statut
Membre
Dernière intervention
9 avril 2008
1
Bien sûr, tu sauves une seule fois le maillage du carré dans un buffer.

Pour afficher des carrés à différentes positions, tu modifies leur matrice de transformation.


C'est comme les textures, on ne charge jamais 2 fois la même texture
dans la mémoire vidéo, on dit juste au moment de l'affichage lesquelles
on veut utiliser.


En fait tu dis à la carte vidéo:

Affiche moi un objet en utilisant

- ce vertex buffer avec cet index buffer (géometrie dans son repère local)

- cette matrice de transformation (grace a qui les vertex seront transposés dans le repère absolu)

- ces textures (skin)

- ces shaders (effets graphiques)
Messages postés
112
Date d'inscription
dimanche 6 juin 2004
Statut
Membre
Dernière intervention
19 septembre 2007

Oki ! Merci beaucoup Galmiza pour tes explications.

Vince
Messages postés
112
Date d'inscription
dimanche 6 juin 2004
Statut
Membre
Dernière intervention
19 septembre 2007

ah... j'ai répondu avant d'avoir la réponse de Luthor...

Vince
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
Quand tu dis "bcp de fois", c'est genre mille ou un million ? Si c'est
1000, le coup mémoire est négligeable. Si c'est un million, de toute
facon, ya pas le choix, il faut tout mettre en mémoire video, si tu
veux avoir un fps correct (ou bon). Dans le deuxième cas, si tu as
besoin de normales et de coordonnées de texture, tu auras besoin de pas
mal de mémoire video.
Messages postés
112
Date d'inscription
dimanche 6 juin 2004
Statut
Membre
Dernière intervention
19 septembre 2007

Beaucoup de fois c'est mille, mais c'est pour le principe car ce nombre risque de beaucoup augmenter. Merci Luthor, je pense que je vais dupliquer les carrés dans le buffer, je ne sais pas si le gain sera très important mais au moins ca ne peut pas être néfaste pour mon fps. Merci encore.

Vince
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
Le gain entre quoi et quoi ? J'ai testé personnellement sur ma X700 les
perfs max que je pouvais obtenir. Je trace 110 millions de triangles
(gl_triangles) par seconde au maximum. Donc si ca peut te donner une
idée des perfs que tu peux obtenir.


Alors qu'avec glbegin/end, je pense pas que tu dépasses le million.
Messages postés
112
Date d'inscription
dimanche 6 juin 2004
Statut
Membre
Dernière intervention
19 septembre 2007

Oui bien sûr, il ne s'agit plus d'utiliser glbegin/end de toutes facons, je parlais du fait de rassembler tous les vbo en un seul (évitant des glDrawElements successifs).

Vince
Messages postés
573
Date d'inscription
samedi 16 novembre 2002
Statut
Membre
Dernière intervention
9 avril 2008
1
Ca depend, si tu désires modifier la position de tes carrés par la suite, met un seul carré dans le buffer et utilise plusieurs appels à glDrawElements en modifiant la matrice de transformation.

Sinon, si tu fais un truc entièrement statique, ou si tes carrés ne bougent pas les uns par rapport aux autres, met les tous dans un buffer et appel un fois pour toute glDrawElements.
Messages postés
112
Date d'inscription
dimanche 6 juin 2004
Statut
Membre
Dernière intervention
19 septembre 2007

Une question pour Luthor : en suivant ce que tu dis, si les carrés bougent quasiment à chaque frame, est-ce que, le temps qu'on a gagné en ne faisant qu'un seul appel glDrawElements, on ne le perd pas à remettre les buffer à jour ? Bon tu me diras, dans la version de Galmiza, lorsqu'on fait une matrice de transformation on fait autant de calcul mais bon... peut-être que ca va plus vite lorsque c'est openGL qui le fait ? (Je sais pas si je suis très clair ^^ c'est pas évident...)

Vince
Messages postés
112
Date d'inscription
dimanche 6 juin 2004
Statut
Membre
Dernière intervention
19 septembre 2007

Ok, je vous remercie Luthor et Galmiza d'avoir pris le temps de me répondre, je vais essayer de faire le moins d'appels possible à glDrawElement donc mettre le plus de chose possible dans les buffers. Bonne soirée à vous deux !

Vince