2010-09-17 19 views
4

Je construis un petit moteur 3D pour un jeu sur lequel je travaille. J'ai mes bases triées: triangles texturés avec abattage de la face arrière. Cependant, le tri en profondeur s'avère être un problème difficile.Comment trier les triangles Z pour un moteur 3D?

Je calcule la face Z en faisant la moyenne des 3 points qui composent la face triangulaire. Les faces les plus longues chevauchent parfois les faces les plus petites, car elles ont une valeur Z plus élevée et se lèvent donc dans la liste d'affichage triée en profondeur.

Comment résoudre ce problème? Je suis sûr qu'il existe des techniques connues de tri en profondeur si je peux seulement obtenir de l'aide pratique pour les programmer. J'ai construire moi-même pipeline rendre donc j'avoir accès à toutes les données requises - triangles, les points, les textures, les coordonnées UV, etc. Cathédrale

rendu dans un programme 3D

alt text

cathédrale rendu dans mon moteur 3D

alt text

Répondre

4

Vous devez subdiviser vos triangles pour qu'ils soient tous à peu près de la même taille, que vous effectuiez vous-même le tri ou que vous utilisiez un tampon z. À moins, bien sûr, que l'algorithme z-buffer ne divise aussi les longs triangles fins pour vous. Le problème est que si vous avez quelques petits triangles compacts et des triangles longs et minces (par exemple), l'algorithme manquera de classer les longs et minces plus souvent qu'autrement. Si vous utilisez le point médian du triangle, il y aura des points de vue où il sera considéré comme "en face" d'un plus compact, alors qu'en réalité il est derrière. Prenez cette vue de haut en bas où + représente le point médian.

  o 

-+-   1 
-----+------ 2 
     -+- 3 

* 

cherche *-o le grand triangle (2) pourrait être interprété comme étant en face du petit triangle (3) et par conséquent tirer sur le dessus de celui-ci.

Si (2) était divisé en 3 ou 4 triangles plus petits, la mise en mémoire tampon z fonctionnerait plus souvent.

+0

Y a-t-il un moyen de biaiser la routine de tri Z pour prendre en compte la zone triangle, sans avoir à diviser le tris? –

+2

Incorrect. C'est exactement le problème que Z-buffering résout. Z-buffering est par pixel et est indépendant de la taille du polygone (il arrive à tout le long du pipeline pour le savoir). Le problème que vous décrivez s'applique uniquement au tri polygonal ou si vous affichez des polygones non opaques. Les questions de précision sont pertinentes pour le z-buffering et il y a une bonne introduction ici: http://www.sjbaker.org/steve/omniv/love_your_z_buffer.html – Justicle

+0

Ce que dit Justicle. De plus, si vous avez besoin de z-tri (par exemple pour la transparence), une méthode de z-tri efficace consiste à utiliser une arborescence BSP. – Kos

4

Vous avez le choix entre soit:

  1. Subdivisez vos mailles de sorte que vous pouvez trier chaque polygone fiable (mais il y a des cas de pointe encore horribles que vous pouvez ou ne pouvez pas voir).

  2. Utilisez un Z-Buffer, qui est soutenu par tout le matériel graphique et est essentiellement libre.

1

Le boîtier d'angle qui complique tout algorithme de tri de triangle est représentée par le schéma suivant:

unsortable triangles

chacun des triangles se trouve en face d'un triangle et derrière l'autre. J'ai dû faire quelques astuces très simples dans inkscape juste pour créer ce diagramme.

Il n'est pas difficile d'organiser des polygones en 3D de 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 rompre le cycle.

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