Mise en œuvre de décalcomanie

11

J'ai eu des problèmes pour trouver des informations sur les décalcomanies, alors peut-être que cette question aidera les autres. L'implémentation concerne un moteur de rendu direct.

Quelqu'un pourrait-il confirmer si j'ai bien appliqué la décalcomanie?

  • Vous définissez un cube de n'importe quelle dimension qui définira le volume de projection dans l'espace commun. Vous vérifiez l'intersection du triangle avec le cube défini pour recevoir les triangles que la projection affectera.
  • Vous coupez ces triangles et les enregistrez.
  • Vous utilisez ensuite des astuces matricielles pour calculer les coordonnées UV des triangles enregistrés qui référenceront la texture que vous projetez.
  • Pour ce faire, vous prenez les vecteurs représentant la hauteur, la largeur et la profondeur du cube dans l'espace commun, de sorte que le coin inférieur gauche soit l'origine.
  • Vous mettez cela dans une matrice comme les vecteurs unitaires i, j, k, définissez la traduction pour le cube, puis vous inversez cette matrice.
  • Vous multipliez les sommets des triangles enregistrés par cette matrice, de cette façon, vous obtenez leurs coordonnées à l'intérieur d'un cube de taille 0 à 1 que vous utilisez comme coordonnées UV.
  • De cette façon, vous avez les triangles originaux sur lesquels vous projetez et vous avez des coordonnées UV pour eux (les coordonnées UV font référence à la texture que vous projetez).
  • Ensuite, vous restituez les triangles enregistrés sur la scène et ils écrasent la zone de projection avec l'image projetée.

Maintenant, les questions pour lesquelles je n'ai pas pu trouver de réponses. Le dernier point est-il exact? Je n'ai jamais fait d'écrêtage logiciel, mais il semble suffisamment sujet aux erreurs, en raison de la précision limitée, que des combats z se produiront pour la texture projetée. La manière d'obtenir les coordonnées UV est-elle également correcte?

dreta
la source
Voici un lien avec des liens: gamedev.stackexchange.com/questions/24653/…
Luis Estrada

Réponses:

5

Jetez un œil à cet article:

http://blog.wolfire.com/2009/06/how-to-project-decals/

Il semble qu'il utilise exactement la même approche que vous utilisez. Il ne parle pas de combats z, mais cela pourrait certainement devenir un problème à de plus grandes distances.

Ma suggestion serait de désactiver les décalcomanies après une certaine distance si les combats z deviennent très visibles.

chevalier666
la source
j'ai vu cet article plusieurs fois, le fait est qu'il ne parle pas du tout de ce que je demande, comme vous l'avez mentionné, les combats z ne sont pas vraiment une question de distance, c'est juste que vous essayons de restituer directement au-dessus de la géométrie existante et en raison de la précision limitée, vous pouvez / ne pouvez pas être sûr que ce sera au-dessus ou exactement au même endroit
dreta
1
Lorsque vous dessinez des décalcomanies, vous pouvez toujours définir la fonction de comparaison de la mémoire tampon de profondeur sur inférieure ou égale plutôt que inférieure à si les décalcomanies sont toujours dessinées juste au-dessus de la surface qu'elles affectent.
jmegaffin
1

Ce que j'ai fait pour résoudre les combats en Z, c'était de bousculer légèrement la valeur Z du sommet, dans mon shader de décalcomanie, après qu'il soit en coordonnées d'écran.

OK ..... J'utilise des décalcomanies ajustées. Je crée un maillage nxn avec Y assis sur le terrain. J'utilise du code pour trouver le Y sur le maillage polygonal des terrains. Après tous les transfroms, je dessine par-dessus la géométrie existante en coordonnées d'écran. Le tampon de profondeur est en coordonnées d'écran, donc en déplaçant légèrement le Z des polygones de décalcomanies vers l'écran, il arrête le combat contre le Z. En faisant cela, j'ai réduit de moitié le nombre de polygones constituant mes mailles de décalcomanies ajustées. C'est l'ancien code 120

 vec4 v = gl_ModelViewProjectionMatrix * gl_Vertex;
 v.z -= .03;
 gl_Position = v;

J'espère que cela explique mieux .. (comme demandé)

Tout le cadre métallique.

Terrain filaire uniquement.

Mike O
la source
1
Cette réponse semble particulièrement courte et imprécise. Pourriez-vous clarifier votre réponse?
Gnemlock
1
Ce n'est pas difficile à comprendre .. Je déplace le sommet d'un peu dans la direction Z dans l'espace écran. Parce que dans OpenGL, vous regardez toujours dans un Z positif dans l'espace à l'écran, déplacer légèrement le Z négatif corrige le combat contre le Z. Il y a cependant un problème avec cela. Lorsque vous effectuez un zoom arrière, le z peut déplacer l'autocollant beaucoup plus que nécessaire.
Mike O