2010-09-09 5 views
3

Je suis actuellement en train de développer mon propre moteur 3D, qui a des capacités très limitées en terme de rendu géométrique et que je veux développer. Ce qui m'intéresse, c'est comment-cela-devrait-être fait en termes de stockage des objets géométriques et de dessin. Pour l'instant, mon abstraction ne supporte que la géométrie de rendu sous forme de listes génériques de triangles (D3DPT_TRIANGLELIST en termes Direct3D). Il existe deux autres façons de représenter les objets, telles que les bandes triangulaires (D3DPT_TRIANGLESTRIP) ou les ventilateurs triangulaires (D3DPT_TRIANGLEFAN).Quel est l'avantage d'utiliser triangle-strip et triangle-fan dans le rendu?

Ma question est: sont-ils réellement utilisés pour dessiner la géométrie dans les moteurs 3D modernes?

Comment leur utilisation peut-elle bénéficier et s'intègre-t-elle dans le pipeline de création de jeux? (je veux dire, comme, les artistes peuvent développer leurs modèles afin qu'ils l'utilisation de ces strips/fans techniques?)

Répondre

4

Il y a quelques autres façons de représentant les objets - tels que bandes de triangle (de D3DPT_TRIANGLESTRIP) ou ventilateurs triangle (D3DPT_TRIANGLEFAN).

Ma question est: sont-ils vraiment utilisé lors du dessin de la géométrie dans les moteurs 3D modernes ?

TriangleStrip sont fréquemment utilisés pour le rendu du terrain ou tout autre type de mailles avec conjuction des indices de bande de redémarrage (0xFFFF ou 0xFFFFFFFF) ou dégénérée bandes. Ils offrent le meilleur ratio en termes de triangles par indice de stockage. Et si vous avez de bonnes maillages optimisés pour le cache de vertex, ils domineront totalement le monde.

TriangleFan sont présents dans D3D9 mais ont été retirés de D3D10 et D3D11. Mon conseil, évitez de les utiliser. La raison pour laquelle ils ne sont plus bons est parce qu'ils font un travail terrible en ce qui concerne les interpolations d'attributs (tels que texcoord ou normales), parce que vous pouvez faire des triangles très minces et allongés avec eux. Vous pouvez argumenter que vous pouvez le faire aussi avec des bandes ou des listes de triangles, bien sûr, mais en fait, la capacité de faire des ventilateurs conduit à des maillages non-amicaux (artefact sage). En l'enlevant de D3D, les outils de création de contenu produiront probablement des tesselations qui évitent les triangles longs qui ont des angles aigus.

Les triangles longs et fins sont également mauvais (performances) car ils génèrent des fragments quadruplés suboptimaux pendant le processus de tramage (voir excellent Humus post on triangulation).

Bien sûr, ce conseil s'applique si vous codez un moteur de rendu haute performance/haute qualité, si vous faites du code hobby, vous ne voulez peut-être pas vous en préoccuper.

5

bandes Triangle sont très fréquents, car ils peuvent représenter des surfaces plus efficacement que les listes de triangle. En outre, vous pouvez assembler des bandes triangulaires séparées visuellement afin que des géométries disjointes entières puissent être rendues en une seule bande. Vous pouvez le faire en dupliquant le dernier sommet de la première bande et le premier sommet de la deuxième bande, créant ainsi deux triangles dégénérés qui comblent l'espace mais ne rendent pas.

Les ventilateurs ne sont pas si communs. Ils peuvent être utiles pour dessiner des polygones convexes, mais même ceux-ci peuvent généralement être faits aussi efficacement avec des bandes.

+0

Aussi maintenant les API graphiques exposent des valeurs d'indice spéciales qui vous évitent de faire de tels tours, voir ma réponse. – Stringer

2

L'avantage est qu'ils réduisent la quantité de données qui doivent être transférées au moteur de rendu. Pour envoyer des triangles N dans une liste, il faut spécifier 3*N points; si elles peuvent être représentés comme une bande ou d'un ventilateur, alors vous ne devez spécifier N+2 des points