Comment fonctionne la cartographie normale?


10

J'essaie de saisir le concept de mappage normal, mais je suis confus par plusieurs choses. En bref, je ne sais pas si une carte normale dépend du point de vue ou non (c'est-à-dire si vous obtiendrez une carte normale différente du même objet lorsque vous la tournerez). Deuxièmement, je ne comprends pas pourquoi la couleur bleuâtre est la couleur prédominante dans les cartes normales.

Voici ce que je pense des normales et de leur relation avec les couleurs RVB. La sphère unitaire représente toute unité normale possible - en d'autres termes, les composantes X, Y et Z d'une plage vectorielle normale unitaire de -1 à 1. Les composantes d'une couleur RVB vont toutes de 0 à 255. Par conséquent, il est logique pour mapper -1 (composante normale) à 0 (composante couleur), 0 à 127 ou 128 et 1 à 255. Toute valeur intermédiaire est juste interpolée linéairement.

L'application de ce mappage aux normales d'un objet 3D arbitraire donne une image très colorée, pas du tout principalement bleue. Par exemple, lors de la prise d'un cube, les six faces auraient une couleur différente mais uniforme. Par exemple, le visage avec la normale (1,0,0) serait (255,128,128), le visage avec la normale (0,0, -1) serait (128,128,0) et ainsi de suite.

Cependant, pour une raison quelconque, les cartes normales d'un cube que j'ai trouvé sont complètement bleuâtres, c'est-à-dire (128,128,255). Mais clairement, les normales ne sont pas toutes dans la direction z positive, c'est-à-dire (0,0,1). Comment cela marche-t-il?

[Éditer]

Ok, donc l'approche décrite ci-dessus semble être appelée la carte normale de l'espace objet ou la carte normale de l'espace mondial . L'autre est appelé la carte normale de l'espace tangent . Je comprends comment une telle carte normale d'espace tangent peut être utilisée pour modifier les normales d'une géométrie, mais je ne suis pas encore complètement sûr de la façon dont elle est réellement calculée (voir mon commentaire dans la réponse de Nicol Bolas).

[Modifier 2]

Je devrais probablement mentionner que je travaille avec des surfaces paramétriques par morceaux. Ces surfaces se composent d'un ensemble de patchs de surface , où chaque patch est associé à son propre espace paramétrique (u, v) = [0,1] x [0,1]. En tout point de la surface, la normale peut être calculée exactement. Apparemment, les vecteurs T ( tangent ) et B ( bi-tangent ) - requis pour couvrir l'espace tangent - ne sont pas simplement les dérivées partielles du patch de surface dans la direction de u et v ...


Avez-vous déjà essayé d'implémenter le phong ou du moins l'ombrage diffus? Connaissez-vous des formules de base comme point (a, b) = cos (angle (a, b)) pour les vecteurs unitaires a, b? Quelques heures de mise en œuvre vous feraient économiser des années de difficultés.
Ivan Kuckir

@Ailurus: voir mon commentaire / réponse sur la façon d'aborder le même problème pour les objets de terrain / champs de hauteur. Cela devient un peu plus compliqué pour d'autres objets, mais les concepts ne devraient pas différer.
teodron

Le cas particulier de la cartographie normale du terrain: gamedev.stackexchange.com/questions/43894/…
teodron

Réponses:


14

Un mappage de texture est le mappage entre des points sur la surface 3D et leurs points correspondants sur une image de texture. Si vous avez un mappage de texture 1: 1, chaque point de la surface 3D est mappé à un point spécifique et unique dans l'image de texture (bien que l'inverse ne soit pas nécessairement vrai. Certains emplacements de la texture ne seront pas nécessairement mappés à des emplacements à la surface).

Avec une telle cartographie, vous pouvez parcourir la surface 3D et stocker chaque normale distincte à l'emplacement correspondant dans la texture.

OK bien, faisons ça. Nous allons parcourir une surface 3D et générer des normales de l'espace objet aux emplacements cartographiés, puis les coller dans la texture. Ainsi, lorsque nous voulons effectuer un rendu, nous récupérons simplement l'espace objet normal de la texture et nous avons terminé. Droite?

Eh bien oui, cela fonctionnerait. Mais cela signifie également que les normales de la texture ne peuvent être utilisées qu'avec cet objet particulier. Et cela signifie également que les normales de la texture ne peuvent être utilisées qu'avec cet objet et avec ce mappage de texture spécifique . Donc, si vous vouliez faire pivoter le mappage de texture d'une manière ou d'une autre avec une transformation UV, vous n'avez pas de chance.

Donc, en général, ce que les gens utilisent, ce sont des cartes normales où les normales sont dans "l'espace tangent". L'espace tangent est l'espace par rapport au point cartographié sur la surface 3D, où la normale non modifiée est dans la direction + Z, et les axes X et Y pointent le long des axes U et V par rapport à la surface.

L'espace tangent régularise essentiellement les normales. Dans l'espace tangent, la normale (0, 0, 1) signifie toujours "non modifié"; c'est la normale que vous obtenez en interpolant la normale du sommet. Cela conduit à un certain nombre de choses utiles que vous pouvez faire , dont l'une des plus importantes est de les stocker dans moins de données.

Puisque le Z sera toujours positif, vous pouvez donc le calculer dans votre shader à partir des composants X et Y. Puisque vous n'avez besoin que de 2 valeurs, vous pouvez donc utiliser (dans la nomenclature du format d'image OpenGL ) GL_RG8, un format de 2 octets par pixel plutôt qu'un format de GL_RGBA84 octets par pixel (ce GL_RGB8sera toujours 4 octets par pixel , car les GPU remplissent chaque pixel de 4 octets). Encore mieux, vous pouvez compresser ces deux valeurs , ce qui conduit à un format de 1 octet par pixel. Vous avez donc réduit la taille de votre texture à 75% de la carte normale de l'espace objet.

Avant de pouvoir parler de n'importe quel type de carte normale, vous devez d'abord savoir ce qu'elle stocke. Est-ce une carte normale de l'espace objet, une carte normale de l'espace tangent ou autre chose?


D'accord, donc le premier type de carte que vous décrivez est une carte normale de l'espace objet , non? C'est le plus coloré, car il stocke les vrais composants X, Y et Z des normales. Le deuxième type, la carte normale de l'espace tangent , semble stocker quelque chose comme les perturbations des normales plutôt que les normales elles-mêmes. Je vais lire sur le concept d'un espace tangent et reviendra plus tard.
Ailurus

Ok, donc l'espace tangent d'un point sur la surface est simplement l'espace de tous les vecteurs tangents de ce point. Cependant, dans ce cas, je ne vois pas comment la normale vue de l'espace tangent peut être autre chose que (0,0,1)? En d'autres termes, je m'attendrais toujours à ce que la carte normale soit uniformément bleue (128,128,255). Pourtant, l'exemple montré sur la page wikipedia ( en.wikipedia.org/wiki/Normal_mapping#How_it_works ) contient d'autres couleurs. Je comprends comment cette carte peut être utilisée pour changer les normales, mais pas comment elle est réellement calculée.
Ailurus

@Ailurus: " Ok, donc l'espace tangent d'un point sur la surface est simplement l'espace de tous les vecteurs tangents de ce point. " Non, ce n'est pas le cas. C'est l'espace défini par la normale (non modifiée) et la direction des coordonnées de texture à ce point de la surface. Il a régularisé la normale stockée dans la texture comme étant relative au mappage de texture et à la normale actuelle avant modifications.
Nicol Bolas

La partie la plus difficile d'une carte normale est probablement la cartographie elle-même (y compris la façon de calculer les vecteurs tangents). Le calcul des vecteurs tangents n'est-il pas intrinsèquement lié à la cartographie / habillage UV de la texture diffuse ET à la géométrie de l'objet dans son ensemble? Autrement dit: vous avez deux cartes normales différentes pour un objet, mais un seul champ tangent (et normal) calculé. Vous pouvez découvrir que vous ne pouvez pas utiliser le champ tangent de manière cohérente avec deux textures normales différentes (bien que géométriquement vous puissiez trouver des mappages uv appropriés, ce qui n'est pas une tâche triviale).
teodron

@NicolBolas Ah, je me suis trompé parce que certaines sources affirment que les vecteurs T, B et N forment une base orthonormée, tandis que d'autres mentionnent que ce n'est pas nécessairement vrai.
Ailurus

3

Les cartes normales sont cartographiées à l'aide de l'espace dit tangent, qui est essentiellement un espace local basé sur l'espace de texture du modèle. Cela devrait répondre à vos deux questions.

Cela ne dépend pas du point de vue car cet espace n'a rien à voir avec la caméra. Dans la carte normale, Z est la direction ascendante. Si vous regardez les normales d'un modèle, la plupart des vecteurs normaux pointeront directement du maillage. La surface du maillage est l'espace de texture dont je parlais, donc dans ce système de coordonnées local, vers le haut est la direction "vers l'extérieur".


Merci d'avoir clarifié cela! Cependant, je n'utilise pas un maillage polygonal comme surface, mais une surface paramétrique lisse par morceaux . Par conséquent, toutes les normales seraient enregistrées comme pointant dans la direction (0,0,1), non?
Ailurus

1

Faites défiler vers le bas dans cette page

Regardez le dessin noir et blanc de droite sous les ensembles de données - c'est (ou du moins auparavant) connu sous le nom de dessin de hérisson, le rendu d'une surface avec chacune de ses normales dessinées

Donc, pour comprendre une carte normale traditionnelle, pensez à un hérisson bouleversé avec toutes ses épines qui dépassent - chacune de ces épines est normale à la surface du hérisson en dessous -

En ce qui concerne votre question sur la sphère, si vous viviez uniquement dans un espace paramétrique, comme avec les traceurs de rayons, l'ensemble infini de normales à la sphère créerait simplement une sphère plus grande - dans un espace tessellé, c'est-à-dire le monde que l'ordinateur nous impose si nous voulons en temps réel, alors vous avez une approximation hérissée d'une sphère.

Maintenant, cet exemple se concentre sur une carte normale OBJECT - il définit des normales par rapport à l'objet, et cela est invariant sous toute rotation, translation ou mise à l'échelle - de l'objet ou de la caméra ou de toute autre chose - comme mentionné précédemment, c'est un seul type de carte normale mais c'est la plus courante


0

Je pense que vous pourriez avoir des idées fausses sur ce que sont les cartes normales. Fondamentalement, c'est une façon de simuler l'apparence de quelque chose de cahoteux alors qu'en fait la géométrie est complètement plate.

Les couleurs d'une carte normale sont interprétées par un shader technologique et traitées en fonction de l'intensité et de la direction de la lumière, ainsi que de la vue de votre caméra. Cela signifie que vous pourriez avoir un sol en brique par exemple, qui est complètement plat, avec une texture plate, mais parce qu'il a une carte normale avec la même forme de brique, lorsque vous regardez autour de lui, la lumière semble rebondir sur le côté des briques, ce qui le rend plus 3D qu'il ne l'est.

Ce n'est bien sûr qu'une illusion, mais c'est beaucoup moins cher que d'avoir une géométrie complexe. Et non, les couleurs de la carte normale ne changent pas. Ils représentent vraiment juste des valeurs à comparer dans le shader. Je suis sûr que quelqu'un ici pourra vous renseigner beaucoup plus en détail.


Je sais, mais merci quand même pour votre réponse :)
Ailurus
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.