[Problème] OpenGL, glBegin(GL_TRIANGLES)

OpenGL, glBegin(GL_TRIANGLES) [Problème] - C - Programmation

Marsh Posté le 28-07-2008 à 23:14:50    

Salut,
 
Voilà je viens de remarquer un truc qui va complètement à l'encontre de ce qui me paraissait logique.
J'ai un programme qui génère un gros volume de triangles.
 
Dans la classe de mon objet je boucle sur mon tableau de triangle pour les générer dans une liste d'affichage.
 
J'ai comparé 2 méthodes :
1 - j'initialise le glBegin(GL_TRIANGLES) en dehors de la boucle, et chaque draw() à ma classe triangle ne génère que des glVertex3f (par 3, donc)
2 - pour chaque triangle, la méthode draw appelle glBegin(GL_TRIANGLES), envoie 3 vertex, puis glEnd(), et ce pour tous les triangles.
 
La théorie m'a toujours fait penser que la méthode 2 est vraiment pourrie et plus lourde que la méthode 1.
 
Et pourtant dans les faits, sur mon volume constituer de 2 000 000 de triangles, avec la méthode 1 ça râme un peu alors qu'avec la méthode 2 c'est totalement fluide.
 
Quelqu'un aurait une explication ??
 
Je vous remercie d'avance !

Reply

Marsh Posté le 28-07-2008 à 23:14:50   

Reply

Marsh Posté le 07-08-2008 à 15:06:02    

si tu travailles sur win32 API met la fonction Sleep(); pour voir ce qui est long

Reply

Marsh Posté le 07-08-2008 à 18:31:02    

Citation :

si tu travailles sur win32 API met la fonction Sleep(); pour voir ce qui est long


 
Gné?
 
Pour répondre à la question originale, en effet, la méthode 2 doit normalement être plus lente que la première. En revanche, il se passe peut être quelque chose d'autre dans ton code que tu as loupé. Il faut aussi savoir que de toute façon la méthode directe (glBegin, glEnd, glVertex) est complètement pourrave. Elle n'existe encore que pour des soucis de retro compatibilité (et va gicler pour opengl 3) et n'est pas du tout optimisée pour le hardware (il est d'ailleurs éventuellement possible que la lib réorganise les données d'une façon plus "hardware friendly", ce qui expliquerait le résultat bizarre mais ça n'est la qu'une supposition de ma part).
Le seul conseil que je pourrait donner c'est de passer par des VertexArrays ou des vertex buffers. C'est bien plus efficace que le mode direct.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed