eplanet
Messages postés112Date d'inscriptiondimanche 6 juin 2004StatutMembreDernière intervention19 septembre 2007
-
24 sept. 2006 à 11:33
eplanet
Messages postés112Date d'inscriptiondimanche 6 juin 2004StatutMembreDernière intervention19 septembre 2007
-
24 sept. 2006 à 20:00
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
Galmiza
Messages postés573Date d'inscriptionsamedi 16 novembre 2002StatutMembreDernière intervention 9 avril 20081 24 sept. 2006 à 11:50
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.
luhtor
Messages postés2023Date d'inscriptionmardi 24 septembre 2002StatutMembreDernière intervention28 juillet 20086 24 sept. 2006 à 12:37
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.
luhtor
Messages postés2023Date d'inscriptionmardi 24 septembre 2002StatutMembreDernière intervention28 juillet 20086 24 sept. 2006 à 19:23
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é.
Vous n’avez pas trouvé la réponse que vous recherchez ?
eplanet
Messages postés112Date d'inscriptiondimanche 6 juin 2004StatutMembreDernière intervention19 septembre 2007 24 sept. 2006 à 12:00
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 ?
Galmiza
Messages postés573Date d'inscriptionsamedi 16 novembre 2002StatutMembreDernière intervention 9 avril 20081 24 sept. 2006 à 12:16
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)
luhtor
Messages postés2023Date d'inscriptionmardi 24 septembre 2002StatutMembreDernière intervention28 juillet 20086 24 sept. 2006 à 13:11
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.
eplanet
Messages postés112Date d'inscriptiondimanche 6 juin 2004StatutMembreDernière intervention19 septembre 2007 24 sept. 2006 à 13:20
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.
luhtor
Messages postés2023Date d'inscriptionmardi 24 septembre 2002StatutMembreDernière intervention28 juillet 20086 24 sept. 2006 à 13:30
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.
eplanet
Messages postés112Date d'inscriptiondimanche 6 juin 2004StatutMembreDernière intervention19 septembre 2007 24 sept. 2006 à 13:44
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).
Galmiza
Messages postés573Date d'inscriptionsamedi 16 novembre 2002StatutMembreDernière intervention 9 avril 20081 24 sept. 2006 à 17:35
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.
eplanet
Messages postés112Date d'inscriptiondimanche 6 juin 2004StatutMembreDernière intervention19 septembre 2007 24 sept. 2006 à 18:59
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...)
eplanet
Messages postés112Date d'inscriptiondimanche 6 juin 2004StatutMembreDernière intervention19 septembre 2007 24 sept. 2006 à 20:00
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 !