8
votes

Comment faire de z-commande dans des logiciels correctement

Je rends des objets 3D sur une toile 2D en faisant tous les calculs nécessaires dans les logiciels. Je n'utilise pas d'accélération graphique.

Initialement, tous les objets étaient des cubes de même taille, afin que je puisse les trier en fonction de leur distance dans Z de la caméra et qui les commanderait correctement. Mais maintenant, j'essaie de dessiner des cubes de dimensions variables. Cela rend mon simple algorithme de commande Z échoue dans la projection en perspective.

J'ai examiné les livres graphiques de l'ordinateur et j'ai trouvé les techniques utilisées, elles recommandent éventuellement une comparaison basée sur Pixel de deux polygones pour déterminer lequel est en avance sur l'autre. C'est probablement ce qu'ils font dans la carte graphique. Mais ce faisant dans des logiciels semble trop difficile et je suppose que ce sera lent pour une utilisation pratique, même si je peux le faire.

Y a-t-il un tour simple pour le faire dans le logiciel? Tous les exemples des premiers jours de graphiques 3D, lorsque des cartes graphiques n'étaient pas disponibles?

Bien que ce soit une question graphique générique 3D, si elle aide, je le fais en haut de l'API HTML5 Canvas 2D.

3d

0 commentaires

3 Réponses :


1
votes

Droite, aujourd'hui, vous utilisez Z-tampon sur le GPU pour effectuer une comparaison de profondeur en pixel. Vous pouvez aussi faire cela dans le logiciel.

La technique de tri ne fonctionnera pas en général, voir Wikipedia . Vous pouvez l'améliorer en brisant vos cubes dans des visages individuels et de les trier au lieu de cubes.

Une technique plus générale utilisée dans de nombreux jeux précoces (par exemple, Doom) est arbres BSP . Ils ne travailleront pas avec des scènes dynamiques car il est coûteux de les créer. Cependant, ils résolvent le problème de commande en général.


0 commentaires

5
votes

Alors que @Ybungalobill a déjà mentionné, Z-tampon est l'algorithme le plus facile à mettre en œuvre. Lorsque vous remplissez les triangles / polygones qui composent vos cubes, interpolez la coordonnée Z entre eux et stockez-le par pixel. Si vous remplissez plus tard un autre polygon qui rend sur la même coordonnée X, Y, vérifiez si son Z est inférieur au Z déjà stocké dans le tampon. N'oubliez pas d'effacer le tampon Z à l'infini avant de repeindre. Pseudocode: xxx pré>

une approche révisée de Z tampon qui fonctionne mieux sur la CPU en ne dessinant pas de pixels qui serait écrasé s'appelle tampon de segment fort>: http://www.gamedev.net/reference/articles/article668.asp p>

Une autre approche est l'algorithme de Warnock strong>. Il utilise la récursivité qui rend difficile l'utilisation des GPU, mais la CPU devrait bien fonctionner si vous utilisez votre propre pile pour éviter le débordement de la pile. L'idée réside dans la division de la scène en 4 parties et vérifie s'il n'y a qu'un seul polygone couvrant la partie entière. Si ce n'est pas le fendre à nouveau jusqu'à ce que la condition soit remplie (elle sera remplie au niveau du pixel dans le pire des cas). Pseudocode: P>

foreach (pixel in screen)  {
  float minZ = infinity;  // Can be zfar from the perspective projection
  Color pixelColor = backgroundColor;
  foreach (polygon in projectedPolygons)  {
    if (polygon contains Point(pixel.x, pixel.y))  {
      float z = interpolateZ(polygon, pixel.x, pixel.y);  // Get the current Z for (x, y) and this polygon using bilinear interpolation
      if (z < minZ)  {
        minZ = z;
        pixelColor = polygon.color;
      }
    }
  }
}


7 commentaires

Le segment-tampon et l'algorithme de chômage sont des candidats prometteurs. Je verrai lequel je peux implémenter. Merci un tas pour une telle réponse détaillée. Je suis déjà en train d'utiliser la protection contre la main dans la projection orthographique, mais je pense que cela ne fonctionne pas avec précision avec la projection de la perspective.


@JAYESH: Backface Culling fonctionne également pour la projection de la perspective également (si les autres conditions mentionnées dans ma réponse sont remplies).


AAH. Votre commentaire m'a fait penser et je pense que je sais maintenant pourquoi l'abattage de la flèche ne fonctionne pas pour moi dans la projection de la perspective. J'utilise dans l'extrême mesure, le fait que tous mes cubes ont la même orientation. Donc, à tout moment, seuls 3 de leurs visages sont visibles. En cas de mode orthogaphique, ce sont les mêmes 3 faces pour tous les cubes. Mais cela me frappe juste maintenant que pour la projection de perspective qui n'est pas vraie, et je devrais calculer séparément des poches cachées pour chaque cube séparément. J'ai besoin de le vérifier, mais je pense que c'est tout. Pensez-vous que cela rendra le tri précis inutile?


Il fera le tri z-inutile si les cubes ne se chevauchent pas sur l'écran. S'ils le font, vous devez toujours trier les cubes. Et au cas où les cubes se croisent (dans la scène), cet algorithme ne le résoudra pas du tout.


J'ai corrigé le dos arrière pour le mode de perspective aussi. En effet, les algorithmes d'abattage diffèrent par des projections orthographiques et de perspective. Pour toute personne intéressée, consultez cette goo.gl/qqgm


Quelle méthode avez-vous utilisée auparavant? Calculer le produit DOT du vecteur de la caméra et la normale, puis en vérifiant son panneau est une approche courante et fonctionne à la fois pour la projection orthographique et en perspective.


Laquelle de ces méthodes serait la bonne à utiliser sur la CPU pour un système tel que Windows, qui n'a que des fenêtres rectentrulaires et doit seulement dessiner le sommet, pour la plupart des effectifs.



1
votes

Ce que j'ai trouvé me convient, c'est une grille fixe combinée à Warnock. Partition La zone de l'écran englobant le (s) modèle (s) dans le tronc dans les cellules:

 Entrez la description de l'image ici

Pour cela, vous pouvez simplement utiliser le rectangle de liaison des primitives que vous insérez. Cette structure peut être assez rapide à la mise à jour car tout ce que vous avez à faire est de manipuler des entiers pour déplacer des objets d'une cellule à une autre. Pour éviter d'allouer et de réaffecter en permanence, utilisez une approche de liste gratuite:

 Entrez la description de l'image ici

Rendez maintenant chaque cellule de grille s'il est "assez simple" (critères de guerre). Sinon, appliquez Warnock.

Une cellule de grille est "assez simple" si le rectangle de la cellule est entièrement contenu dans les triangles que vous rendantez pour cette cellule, par ex. et tous les 4 points d'intersection pour le rectangle dans un triangle donné sont devant tous les autres (ont la valeur de profondeur minimale) ... ou si la cellule est vide ou une primitive.

Cela dit, je ne le fais pas vraiment à des fins d'affichage en temps réel. Il pourrait être assez difficile de le faire assez efficacement sur des mailles complexes en temps réel.

Je le fais principalement pour faire des choses comme le marquage et Lasso sélectionner des sommets / des bords / des polygones dans des logiciels 3D sur des mailles très denses sur des maillages très denses où nous ne voulons pas manquer des primitives non occlus en se rapprochant d'une résolution de pixels fixe. Dans ce cas, l'utilisateur pourrait zoomer loin loin d'un maillage et nous ne voulons pas que nos sélections de lasso et de marquisée manquent toute une bande de primitives de sous-pixels, alors l'attrait de l'utilisation d'un warnock indépendant de la résolution ici est que vous pouvez récursivement Appliquez l'algorithme aussi profond que nécessaire jusqu'à ce que vous obteniez ce résultat «assez simple», ce qui pourrait être un rectangle beaucoup plus petit qu'un pixel. Il pourrait également être utile pour l'antialiasing avec un sous-échantillonnage raisonnablement efficace (puisqu'il ne sera pas sous-échantillon si un pixel a une couverture complète, par ex.). Je n'ai jamais utilisé cela pour les contextes de rasterization.

Raytraçage est également amusant à cause de toutes les options qu'il ouvre jusqu'à ce que l'éclairage indirect, la caustique, le DOF, etc., bien qu'il soit très coûteux, comme indiqué par Karel. Cela dit, j'ai trouvé avec un bon BVH que je puisse faire de rayonnage en temps réel ces jours-ci à peu près élevé si je fais tout simplement un éclairage direct.

Voici un petit exemple que je tire de rayonnant un million de mailles triangle en temps réel sur la CPU que j'ai fouillée de quelques années de retour. C'était sur mon i3 et à 1600x1200 pixels. N'a pris qu'une journée pour le coder. Le GIF s'est vraiment déclassé la qualité et le taux de trame (était à l'origine plus de ~ 120 fps) mais j'espère que vous obtiendrez l'idée:

 Entrez la description de l'image ici

L'inconvénient principal pour moi avec une rayonnière en temps réel sur la CPU (ainsi que le GPU) n'est en réalité pas la partie de la rastérisation. Bien que je puisse rendre les matières de base et l'éclairage en temps réel assez facilement avec une i3 (et cela n'était même pas optimisé le code, juste quelques boucles de base de la SIMD et des boucles parallèles en C), il serait beaucoup plus difficile si ce million de mailles triangle était déformée chaque Cadre. Ensuite, je devrais pouvoir mettre à jour le BVH de stocker plus d'un million de triangles à plus de 100 fps que je n'ai aucune idée de la façon de faire assez rapidement.

Cela dit, il y a un logiciel qui vomissait en réalité des millions de polygones de données déformantes en temps réel. Ça s'appelle zbrush:  http://i1.wp.com/www.cgmeetup.net/home/wp-content/uploads/2013/11/Zbrush-Character-Modeling-for-the-last-fus- 8.jpg

Je n'ai aucune idée de la façon dont ils le gèrent. Ils peuvent utiliser LOD ou voxeliser le maillage super rapide pendant que les utilisateurs le déforment avec une brosse ou quelque chose; Pour moi, cela n'a pas vraiment d'importance car ils vous permettent de contrôler les choses au niveau par-sommet, le niveau per-polygone, vous permettant de voir des caractères métalliques et de vous laisser entrer et sortir des mailles polygonales lors du chargement et de l'épargne. De toute façon, il a pour effet de manipuler des millions de polygones de données (elle a même réussi à rasteriser et à déformer des mailles de plus de 20 millions de polygones il y a 17 ans, sans précédent; les gens ne peuvent même pas correspondre aujourd'hui 17 ans plus tard) et de permettre à la L'utilisateur doit sculpter les résultats et contrôler les choses à un niveau par sommet en quelque sorte tout en maintenant des tarifs de trame interactifs sans utiliser le GPU pour la rasterisation. Ils ont eu une sorte de programmation de Voodoo y allant jusqu'à ce que je le vois, bien que je puisse échanger un doigt pour savoir comment ils le font.


0 commentaires