Cartes normales vs normales

17

J'utilise l'importateur d'assimp Assimp ( http://assimp.sourceforge.net/lib_html/index.html ) pour analyser les modèles 3D.

Jusqu'à présent, j'ai simplement retiré les vecteurs normaux définis pour chaque sommet de mes mailles. Pourtant, j'ai également trouvé divers tutoriels sur des cartes normales ...

Si je comprends bien les cartes normales, les vecteurs normaux sont stockés dans chaque texel d'une carte normale, et vous les retirez de la texture normale dans le shader.

Pourquoi y a-t-il deux façons d'obtenir les normales, laquelle est considérée comme la meilleure pratique et pourquoi?

KaiserJohaan
la source

Réponses:

31

Réponse courte

Les cartes normales et les normales sont deux choses différentes: les normales sont une propriété géométrique de tout maillage / surface, son utilisation n'est pas exclusive pour les calculs d'ombrage et d'éclairage, mais a en fait de nombreuses autres utilisations, par exemple en physique. Les cartes normales sont des textures qui codent des vecteurs normaux alternatifs utilisés en infographie pour simuler des bosses.

Longue réponse

Normales en géométrie une normale est un vecteur ou une ligne perpendiculaire à un objet donné (par exemple plan normal, sommet normal). Les normales dans les graphiques sont généralement utilisées pour les calculs de lumière, tels que le calcul de la réflexion diffuse à travers une surface en prenant le produit scalaire entre la direction de la lumière et les normales de surface. Les normales sont généralement calculées en fonction des propriétés géométriques du maillage (faces / sommets), en prenant le produit croisé de deux arêtes non parallèles situées sur le même plan.

Dans OpenGL, les normales sont spécifiées par sommet (d'où le nom d'attributs de sommet) même si elles peuvent être calculées uniquement pour chaque face dans ce cas, vous devez spécifier la même normale pour chaque sommet d'une face. Les normales peuvent être interpolées par OpenGL sur chaque sommet d'une face (triangle) afin que vous puissiez calculer la lumière réfléchie par pixel et non par sommet, donnant ainsi un résultat plus précis .

Correspondance normale : d'autre part, est une technique en infographie qui code les normales dans une carte de texture, de sorte que chaque normale est codée par texel. Il est généralement utilisé pour simuler l'éclairage des bosses et des bosses (par exemple, cartographie des bosses, cartographie de parallaxe).

Étant donné que les normales sont calculées en fonction des propriétés géométriques du maillage / de la surface, les cartes normales vous offrent des normales alternatives qui peuvent simuler les bosses pour ajouter des détails à la surface sans ajouter plus de polygones.

Les cartes normales sont généralement générées à l'aide d'un modèle 3D beaucoup plus détaillé, puis en calculant les normales sur la base de ce modèle et en les encodant dans une carte normale.

Pourquoi avons-nous besoin des deux?

Eh bien, ne parlant que de rendu, les normales et les cartes normales sont généralement utilisées ensemble pour obtenir l'effet d'éclairage final, un bon exemple peut être un shader de relief, où vous avez besoin de la carte normale pour obtenir l'effet d'éclairage de relief, et vous aurez toujours besoin du géométrique normale pour calculer ce qu'on appelle l' espace tangent . L'espace tangent est généralement utilisé pour permettre la réutilisation des cartes normales.

Gardez à l'esprit qu'une normale est considérée comme un attribut géométrique de la surface et a beaucoup plus d'utilisations que les seuls calculs de lumière. Les cartes normales, d'autre part, sont généralement utilisées pour les effets superficiels.

Étendre la réponse pour expliquer pourquoi les espaces tangents sont importants:

Réponse courte: les espaces tangents sont utilisés pour rendre les cartes normales indépendantes de la géométrie sous-jacente.

[EDIT] Ajout d'une image pour représenter la carte normale dans l'espace tangent et la carte normale dans l'espace mondial.

entrez la description de l'image ici

Réponse longue: L'image ci-dessous montre le plan UV et la normale qui définit l'espace tangent, lors de la génération d'une carte normale, nous saurons déjà que l'espace utilisé aura toujours le pointage Normal dans la direction Z (c'est pourquoi les cartes normales semblent bleuâtres) , cela nous aidera à ignorer la courbure de surface **,.

L'espace tangent nous donne l'avantage que notre encodage normal de cartes n'est pas lié à des normales de maillage spécifiques. Supposons que nous encodons notre carte normale dans l'espace du monde ou de l'objet, alors chaque normale que nous encodons aura une direction basée sur la façon dont les normales de maillage d'origine varient dans l'espace du monde, sans oublier que votre carte normale sera affectée par les transformations du modèle.

entrez la description de l'image ici

Dans les deux images ci-dessus, il est assez clair que l'espace des tangentes crée des cartes normales (à droite), indépendantes de la géométrie sous-jacente car toutes les normales sont encodées dans presque la même direction avec une petite variation pour simuler l'effet des bosses.

** la courbure de surface est définie par la quantité à laquelle un objet géométrique s'écarte d'être plat ou droit dans le cas d'une ligne, mais cela est défini de différentes manières selon le contexte.

Représentation de l'espace tangent

concept3d
la source
1
Si vous pouvez trouver une image décrivant comment une texture normale seule ne peut pas être utilisée de manière cohérente sans un champ normal et tangent défini sur une base par sommet, vous en ferez la meilleure réponse à ce problème déroutant pour la plupart des programmeurs graphiques débutants!
teodron
Belle réponse mais les normales ne sont pas interpolées par OpenGL sur chaque face. Vous devez le faire vous-même et fournir la normale interpolée à OpenGL (ou à votre code de shader).
Anastasios G
1
@AnastasiosG Je pense qu'il parle du comportement par défaut des données variables car elles sont interpolées sur un triangle chaque fois qu'un fragment est calculé pour une primitive spécifique. Je sais qu'il y avait un indicateur que vous pourriez utiliser pour dire à OpenGL d'utiliser une normale spécifique parmi les 3 normales de sommet possibles d'un triangle, mais ce n'est pas le comportement par défaut que je sache.
teodron
1
@AnastasiosG Je pensais qu'un tel détail ne ferait aucune faveur car il ne s'agit pas de savoir comment utiliser OpenGL. Mais si cela aide, à l'ère du pipeline fixe, vous aviez besoin de glShadeModel (GL_SMOOTH) pour dire à openGL d'interpoler. Dans l'ère du pipeline programmable, vous définissez les variables comme variant ou in / out dans le shader afin qu'OpenGL puisse interpoler.
concept3d
Je voudrais ajouter que les reliefs sont simplement des normales (géométriques) qui sont élevées / abaissées sur la base d'une texture en noir et blanc. :)
Entalpi