Indexation des triangles composant une surface 3D

jcloupgarou Messages postés 22 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 19 juillet 2006 - 16 mars 2006 à 12:13
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 - 17 mars 2006 à 09:32
Bonjour, je fais une appli de modélisation 3D, avec la possibilité de loader des modeles 3D de différents formats.
Un objet 3D est un ensemble de faces composés par des triangles.
A l'heure actuelle, je dessine pour chaque face tous les triangles, qui sont placés dans une liste d'affichage.
Debut Liste d'affichage
Tant que toute les faces ne sont pas déssinées
Tant que tous les triangles Ti d'une face n'ont pas été déssinés
Je dessine le triangle Ti
glBegin(GL_TRIANGLES)
glNormal(au Sommet 1)
glVertex(Sommet1)
glNormal(au Sommet 2)
glVertex(Sommet2)
glNormal(au Sommet 3)
glVertex(Sommet3)
glEnd();
FinTantque
FinTantque
Fin Liste d'affichage

Dans cette configuration, j'affiche un nombre concidérable de fois les memes vertex, vu que les triangles sont collés les uns aux autres.
J'aimerais utiliser GL_TRIANGLE_STRIP et GL_TRIANGLE_FAN pour optimiser l'appel à glVertex, mais mes listes de triangles décrivant les faces ne sont pas ordonnées.
Comment trouvé le bon ordre des triangles permettant d'affiché en strip ou en fan ?
Si vous avez deja concocté un algo similaire, merci de me filer un ptit coup de main, je patauge !
Bonne continuation.

Jc.

4 réponses

Galmiza Messages postés 573 Date d'inscription samedi 16 novembre 2002 Statut Membre Dernière intervention 9 avril 2008 1
16 mars 2006 à 20:37
La carte vidéo a du cache.
Si tu dois afficher les triangles 1,2,3 et 2,3,4, la carte fera 4 projections au total pour les deux triangles car garde en mémoire le résultat de la transformation des vertex 2 et 3. Donc aucun avantage qui en vaille la peine niveau vitesse de calcul par rapport a un triangle strip 1,2,3,4. Le seul avantage d'un index buffer indexé en strip (ou fan) est sa taille plus réduite.

Trouver la strip list qui minimise au mieux l'index buffer est très compliqué (gourmand en temps de calcul aussi) j'en avais fait un mais je ne l'utilise pas, si je le retrouve je te le file. Il réduit très sensiblement la taille de l'index buffer mais niveau vitesse d'execution.... pas de gain mesurable :(.

Bref pour accélérer ta vitesse d'affichage il faut que tu regroupes les triangles de façon à ce que les vertex utilisés pour l'affichage d'un triangle aient été utilisé le plus récement possible pour l'affichage des triangles précedent...... en gros c'est une histoire de cache.

J'utilise un script 3DSMax pour générer mes listes de vertex et d'index. Je n'ai pas vérifier mais à première vu il me semble que l'index buffer générer est assez optimisé par defaut.
0
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
17 mars 2006 à 00:14
Utiliser un TRIANGLE_STRIP réduit la quantité de données qui se balade sur le bus non ?



Sinon, le plus optimisé pour afficher un mesh, c'est d'utiliser les
vertex array. Il me semble que tu peux pas faire plus rapide pour
afficher une série de primitives. C'est pas très compliqué à utiliser,
mais ca nécessite que tes données soient stockés de facon ordonnée.



Regarde du coté de :

glEnableClientState(GL_VERTEX_ARRAY);

glVertexPointer(...)



et donc:

glDrawArrays()

glDrawElements()

glMultiDrawArrays()

glMultiDrawElements()
0
Galmiza Messages postés 573 Date d'inscription samedi 16 novembre 2002 Statut Membre Dernière intervention 9 avril 2008 1
17 mars 2006 à 00:32
Excuse-moi, quand je dis "index buffer", je suppose qu'il est chargé dans la mémoire vidéo.

C'est vrai qu'avec cette méthode:
glBegin(GL_TRIANGLES)
glNormal(au Sommet 1)
glVertex(Sommet1)
glNormal(au Sommet 2)
glVertex(Sommet2)
glNormal(au Sommet 3)
glVertex(Sommet3)
glEnd();
Les données passent de la RAM à la Vidéo RAM via AGP et de plus la carte doit se taper à chaque fois le calcul des transformations des points car pas d'indexation.

Ce que j'ai dit ne fonctionne que si tes données graphiques (ici vertex buffer et index buffer) ont été préalablement chargées dans la mémoire vidéo.
Le bus AGP n'est pas infiniment rapide, il faut limiter au maximum la quantité de données qui y transite pendant les rendus.

PS: je ne pensais pas (je n'arrivais pas à croire) que c'étaient des vrais lignes de codes, mais juste l'algorithme. Pour info, avec DX c'est DrawPrimitives()
0
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
17 mars 2006 à 09:32
Apparemment sous DX, l'utilisation du vertes array est plus simple que
sous opengl, ou disons que c'est la méthode utilisée habituellement.
Sous opengl, il existe des méthodes très simples, mais peu efficace
comme l'appel à glBegin/End.
0
Rejoignez-nous