6
votes

Comment est-ce que z-trie triangles pour un moteur 3D?

Je construis un petit moteur 3D pour un jeu que je travaille. J'ai mes basiciens triés: Triangles texturés avec colle de fond. Cependant, le tri de la profondeur se révèle être un problème difficile.

Je calcule le visage z en calculant la moyenne des 3 points qui constituent le visage triangulaire. Les visages plus longs chevauchent parfois les faces plus petites puisqu'elles ont une valeur Z plus grande et se souplacent donc dans la liste d'affichage triés en profondeur.

Comment puis-je résoudre ce problème? Je suis sûr qu'il y a des techniques de tri de profondeur connues si je peux seulement obtenir une aide pratique pour les programmer. J'ai construit le pipeline de rendu moi-même, j'ai donc accès à toutes les données requises - Triangles, points, textures, coordonnées UV, etc.

cathédrale rendue dans un programme 3D

text alt

cathédrale rendue dans mon moteur 3D

text alt


0 commentaires

3 Réponses :


5
votes

Vous êtes à:

  1. subdiviser vos mailles pour que vous peut trier chaque polygone de manière fiable (mais Il y a encore des cas de bord horribles que vous pouvez ou ne pas voir).

  2. Utilisez un z-tampon , qui est supporté par tous matériel graphique et est essentiellement GRATUIT.


0 commentaires

6
votes

Vous devez subdiviser vos triangles de manière à ce qu'ils soient à peu près de la même taille - que vous fassiez le tri et utilisez un z-tampon. À moins que, bien sûr, l'algorithme Z-tampon divise également les longs triangles minces pour vous.

Le problème est que si vous avez de petits triangles compacts et des longs minces minces (par exemple), l'algorithme manquera de classifier les longs minces plus souvent que non. Si vous utilisez le point médiocre du triangle, il y aura des points de vue dans lesquels il sera considéré comme «devant» d'un plus compact en fait s'il est vraiment en retard. Prenez cette vue de haut en bas où + représente le point médian. xxx

à la recherche de * à O < / code> Le grand triangle (2) pourrait être interprété comme étant devant le petit triangle (3) et donc être tiré de dessus.

si (2) a été divisé en 3 ou 4 plus petit Triangles alors le z-tampon travaillerait plus de temps.


5 commentaires

Y a-t-il un moyen de biaiser la routine de tri z pour prendre en compte la zone du triangle, sans avoir à scinder Tris?


Incorrect. C'est exactement le problème que les résolves z-tampon. Le z-tampon est par pixel et est indépendant de la taille du polygone (il arrive de loin le pipeline à savoir). Le problème que vous décrivez est uniquement applicable au tri des polygones ou si vous rendant des polygones non opaques. Les problèmes de précision sont pertinents pour z-buffering et il existe une bonne intro ici: Sjbaker.org/steve /omniv/love_your_z_buffer.html


Quelle justicle a dit. De plus, si vous avez besoin de z-tri (par exemple pour la transparence), un moyen de tri informellement efficace est d'utiliser un arbre BSP.


@Kos - Si vous avez une scène statique, un arbre BSP est la bonne façon d'y aller. Cela couvre le cas général des objets en mouvement.


Z-Buffering ne fonctionne que si tous les triangles sont une taille similaire. Si cela est long et mince, vous obtiendrez ce problème.



2
votes

Le boîtier de coin qui complique tout algorithme de tri triangle est représenté par le diagramme suivant:

 triangles non financées

Chacun des triangles est devant un triangle et derrière l'autre. Je devais faire des astuces très simples dans les inconvénients pour créer ce diagramme.

Il n'est pas difficile d'organiser des polygones en 3D de telle sorte que vous ayez un cycle dans le graphique "devant". Pour résoudre ce problème, votre algorithme aurait besoin de la capacité de subdiviser les triangles pour briser le cycle.

C'est l'une des raisons pour lesquelles les tampons Z sont si populaires (et ils sont facilement accélérés dans le matériel).


0 commentaires