C'est la norme: quelles sont les cartes normales et comment fonctionnent-elles

Pendant plusieurs années, j'ai essayé de comprendre les cartes normales et les problèmes qui se posent généralement lorsque l'on travaille avec elles.

La plupart des explications que j'ai trouvées étaient trop techniques, incomplètes ou trop compliquées pour que je les comprenne, alors j'ai décidé d'essayer d'expliquer les informations que j'ai recueillies. Je comprends que ces explications peuvent être incomplètes ou pas entièrement exactes, mais j'essaierai quand même.

Les premiers modèles 3D créés par l'homme ressemblaient à ceci:

image

C'est très bien, mais un tel modèle a une limitation évidente: il a l'air trop polygonal.

La solution la plus évidente: ajoutez plus de polygones, rendant la surface plus uniforme et lisse, jusqu'à ce que les polygones apparaissent comme une seule surface lisse. Mais il s'avère que pour rendre des surfaces comme des sphères lisses, vous avez besoin d'un grand nombre de polygones (surtout aujourd'hui).

image

Une solution différente était nécessaire, et donc les normales ont été inventées. (Ça ne s'est pas passé comme ça, mais c'est plus facile à expliquer et à comprendre.)

Suivons la ligne du centre du polygone perpendiculaire à sa surface. Nous donnerons à cette ligne un nom très inhabituel: normal. Le but de la normale est de contrôler où la surface pointe, de sorte que lorsque la lumière se reflète sur cette surface, elle peut utiliser la normale pour calculer la réflexion résultante. Lorsque la lumière frappe le polygone, nous comparons l'angle du rayon lumineux avec la normale du polygone. Le faisceau est réfléchi au même angle par rapport à la direction normale:

image

En d'autres termes, la réflexion de la lumière sera symétrique par rapport à la normale du polygone. C'est ainsi que fonctionnent la plupart des réflexions dans le monde réel. Par défaut, les rayons lumineux sont réfléchis par tous les polygones complètement perpendiculaires à leur surface (comme ils le devraient dans la vraie vie), car les normales des polygones sont perpendiculaires à la surface du polygone par défaut. S'il y a des lacunes dans les normales, alors nous les verrons comme des surfaces séparées, car la lumière sera réfléchie dans l'une ou l'autre direction.

image

Si les deux faces sont connectées, nous pouvons demander à l'ordinateur de lisser la transition entre la normale d'un polygone à l'autre, de sorte que les normales soient progressivement alignées en fonction de la normale la plus proche du polygone. Ainsi, lorsque la lumière frappe exactement le centre d'un polygone, elle sera réfléchie directement, conformément à la direction de la normale. Mais entre les polygones, cette direction normale est lissée, modifiant la réflexion de la lumière.

image

Nous percevrons la transition comme une seule surface, car la lumière sera réfléchie entre l'un et l'autre polygone de manière fluide, et il n'y aura pas d'espace entre eux. En fait, la lumière se reflète en douceur sur ces polygones, comme si nous en avions plusieurs.

C'est ce que nous contrôlons en définissant des groupes de lissage (3ds Max, Blender) ou en spécifiant des bords durs ou lisses (Modo, Maya): nous indiquons au programme quelles transitions entre les faces doivent être lisses et lesquelles doivent être dures.

Voici une comparaison d'une sphère de 288 polygones avec des transitions dures et lisses:

image

Potentiellement, nous pouvons spécifier quelque chose comme un parallélépipède afin que tous ses sommets aient des normales moyennes. L'éditeur 3D s'efforcera de lisser sa surface afin qu'elle ressemble à une seule surface lisse. Pour un éditeur 3D, c'est assez logique, mais cela semble très étrange, car nous avons un objet qui devrait évidemment avoir plusieurs surfaces distinctes (chaque face de la boîte), cependant, le programme essaie de les montrer comme une surface lisse.

image

C'est pourquoi les éditeurs 3D ont généralement un paramètre pour les angles de lissage: si nous avons deux polygones connectés à un angle dépassant l'angle de lissage, alors leur transition sera lisse et les polygones de connexion à un angle inférieur à l'angle de lissage seront rigides. Pour cette raison, les angles raides entre les surfaces seront affichés sous forme de surfaces différentes, comme cela se produit dans le monde réel.

Nous avons donc utilisé les normales pour contrôler les transitions entre les faces du modèle, mais vous pouvez aller encore plus loin.

Puisque nous modifions la façon dont la lumière est réfléchie par un objet, nous pouvons également faire en sorte qu'un objet très simple reflète la lumière comme complexe. C'est ce qu'on appelle une carte normale. Nous utilisons une texture pour changer la direction de la lumière réfléchie par un objet 3D, la rendant plus dure qu'elle ne l'est réellement.

Un exemple du monde réel est les hologrammes qui étaient auparavant donnés en cadeau lors de l'achat de croustilles (au moins ici, en Espagne). Ils sont complètement plats, mais ils réfléchissent la lumière comme le ferait un objet 3D, ce qui le rend plus difficile qu'il ne l'est vraiment. Dans le monde du graphisme 3D, cela fonctionne encore mieux, mais a toujours ses limites (puisque la surface reste plate).

Bien que nous utilisions les normales de polygone pour implémenter une sorte de magie noire, en fait, nous ne contrôlons pas le lissage de la surface du modèle en utilisant les normales de polygone. Nous utilisons des normales de sommet pour contrôler le lissage des normales. En substance, l'idée est la même, mais un peu plus compliquée.

Chaque sommet peut être associé à une ou plusieurs normales. S'il a une normale, alors nous pouvons l'appeler la normale moyenne du sommet, et si plusieurs - alors la normale divisée du sommet.

Prenons deux polygones reliés par une arête. Si la transition entre deux faces est lisse (si nous l'avons spécifiée comme lisse dans Maya / Modo, ou si les deux ont le même groupe de lissage dans Max / Blender), alors chaque sommet a une normale, qui est la normale moyenne des polygones (c'est pourquoi on l'appelle la normale moyenne du sommet ) Remarque importante: jusqu'à récemment, chaque éditeur 3D utilisait sa propre façon de calculer les normales moyennes des sommets, c'est-à-dire que les cartes normales calculées dans un programme dans un autre pouvaient avoir un aspect complètement différent. Je vais vous en dire plus à ce sujet dans la deuxième partie du tutoriel.

image

Si la transition est dure (bord dur ou différents groupes de lissage), alors chaque sommet a plusieurs normales: une pour chaque sommet connecté aligné selon leurs normales. Dans ce cas, un espace est formé entre les normales, qui ressemble à deux surfaces différentes. C'est ce qu'on appelle le sommet divisé normal.

image

image

Comme vous pouvez le deviner, le contrôle normal des sommets est très important si nous voulons contrôler les cartes normales. Heureusement, nous n'avons pas à changer directement les normales ni même à les voir, mais comprendre comment cela fonctionne vous aidera à comprendre pourquoi nous faisons ce travail et à mieux comprendre les problèmes que nous pouvons rencontrer.

Lors de la cuisson d'une carte normale, nous demandons essentiellement au programme de changer la direction que suivent les normales du modèle lowpoly, afin qu'elles correspondent à la direction dans le modèle highpoly; par conséquent, le modèle lowpoly réfléchira la lumière de la même manière que le highpoly. Toutes ces informations sont stockées dans une texture appelée carte normale. Regardons un exemple.

Disons que nous avons un tel modèle low-poly (lowpoly). Une surface plate à quatre sommets avec des paramètres UV que le programme de cuisson utilisera pour créer une carte normale.

image

Et elle a besoin d'obtenir des informations sur les normales de ce modèle highpoly, dont les normales sont plus compliquées.

image

N'oubliez pas que nous ne transférons que des informations sur les normales, c'est-à-dire les UV, les matériaux, la topologie, les transformations, etc. sans objet. Règle éprouvée: si le modèle highpoly semble bon, alors ses normales sont également bonnes et devraient être adaptées à la cuisson.

Le programme de cuisson prend un modèle lowpoly et émet des rayons suivant les directions des normales lowpoly (c'est pourquoi nous devons contrôler les normales lowpoly). Ces rayons ont une longueur limitée afin de ne pas obtenir d'informations normales à partir de bords éloignés (généralement cette distance est appelée distance de cuisson ou distance de cage). Lorsque ces rayons entrent en collision avec le highpoly, le programme de cuisson calcule comment refléter ces rayons afin qu'ils suivent la direction des normales du highpoly et stocke ces informations dans la carte normale.

image

Voici le résultat de cuisson pour notre exemple:

image

Nous avons une texture que le moteur utilise pour changer les normales lowpoly afin que la lumière se reflète sur ce modèle lowpoly comme elle le ferait sur la version highpoly. N'oubliez pas que ce n'est qu'une texture qui n'affecte pas la silhouette du modèle lowpoly (il est impossible de changer la façon dont la lumière est réfléchie par le modèle si la lumière ne tombe pas sur ce modèle).

Bien qu'il soit clair que l'on peut «compter» l'apparence d'un highpoly par l'apparition d'une carte normale, il est évident que les cartes normales ne sont pas des textures ordinaires car elles stockent des informations non pas sur la couleur, mais sur les normales. Cela signifie également que les cartes normales ne peuvent pas être considérées comme des textures ordinaires; en outre, comme nous le verrons, ils ont des paramètres spéciaux de compression et de correction gamma.

Vous pouvez percevoir la carte normale comme un ensemble de trois textures dans des tons de gris, stockées dans une image:

image

La première image indique au moteur comment ce modèle devrait refléter l'incident lumineux sur la droite; il est stocké dans le canal rouge de la texture de carte normale.

La deuxième image indique au moteur comment le modèle doit refléter la lumière incidente par le bas *; il est stocké dans le canal vert de la texture de carte normale.

* Dans certains programmes, la lumière ne tombe pas d'en bas, mais d'en haut, c'est-à-dire qu'il peut y avoir des cartes normales «gauche» et «droite». Comme nous le verrons plus loin, cela peut poser quelques problèmes.

La troisième image indique au moteur comment le modèle doit refléter la lumière incidente de l'avant; il est stocké dans le canal bleu de la texture de carte normale. Étant donné que la plupart des objets apparaissent blancs lorsqu'ils sont éclairés de face, les cartes normales apparaissent généralement bleuâtres.

Lorsque nous combinons les trois images en une seule, nous obtenons une carte normale. N'oubliez pas que cette explication n'est pas complètement correcte, mais j'espère qu'elle vous permettra de comprendre les informations stockées dans la carte normale et de mieux comprendre ce qu'elle fait.

Pour résumer:

Les normales sont des vecteurs qui sont utilisés pour déterminer comment la lumière est réfléchie par une surface. Ils peuvent être utilisés pour contrôler la transition entre les faces (en faisant la moyenne des normales des sommets connectés pour créer une transition en douceur ou en les séparant pour créer une transition rigide), mais vous pouvez également changer leur direction afin que le modèle lowpoly reflète la lumière de la même manière qu'un modèle plus complexe.

Ces informations sont stockées dans trois canaux d'image distincts, et un éditeur 3D les lit pour comprendre dans quelle direction la surface du modèle doit ressembler.

Dans le prochain article de la série, nous parlerons de la façon de cuire ces pièces du modèle highpoly en lowpoly.

Source: https://habr.com/ru/post/fr481480/


All Articles