Normalen vs Normal Karten

17

Ich verwende Assimp Asset Importer ( http://assimp.sourceforge.net/lib_html/index.html ), um 3D-Modelle zu analysieren.

Bisher habe ich einfach die normalen Vektoren herausgezogen, die für jeden Scheitelpunkt in meinen Netzen definiert sind. Ich habe aber auch diverse Tutorials zu normalen Karten gefunden ...

Wie ich es für normale Maps verstehe, werden die normalen Vektoren in jedem Texel einer normalen Map gespeichert, und Sie ziehen diese im Shader aus der normalen Textur heraus.

Warum gibt es zwei Möglichkeiten, um die Normalwerte zu ermitteln, welche davon als Best-Practice-Methode eingestuft wird und warum?

KaiserJohaan
quelle

Antworten:

31

Kurze Antwort

Normale Karten und Normalen sind zwei verschiedene Dinge: Normalen sind eine geometrische Eigenschaft eines Netzes / einer Oberfläche, deren Verwendung nicht ausschließlich für Schatten- und Beleuchtungsberechnungen gilt, sondern tatsächlich viele andere Verwendungszwecke hat, beispielsweise in der Physik. Normale Karten sind Texturen, die alternative normale Vektoren codieren, die in Computergrafiken zur Simulation von Unebenheiten verwendet werden.

Lange Antwort

Normalen in der Geometrie Eine Normale ist ein Vektor oder eine Linie, die senkrecht zu einem bestimmten Objekt steht (z. B. Ebenennormale , Scheitelpunktnormale). Normalen in Grafiken werden normalerweise für Lichtberechnungen verwendet, z. B. zur Berechnung der diffusen Reflexion über eine Oberfläche, indem das Punktprodukt zwischen der Lichtrichtung und den Oberflächennormalen genommen wird. Normalen werden normalerweise basierend auf den geometrischen Eigenschaften des Netzes (Flächen / Eckpunkte) berechnet, indem das Kreuzprodukt von zwei nicht parallelen Kanten genommen wird, die auf derselben Ebene liegen.

In OpenGL werden Normalen pro Scheitelpunkt angegeben (daher Scheitelpunktattribute genannt), obwohl sie in diesem Fall möglicherweise nur für jede Fläche berechnet werden. In diesem Fall müssen Sie für jeden Scheitelpunkt in einer Fläche dieselbe Norm angeben. Normalen können mit OpenGL über jeden Scheitelpunkt einer Fläche (Dreieck) interpoliert werden, sodass Sie das reflektierte Licht pro Pixel und nicht pro Scheitelpunkt berechnen und so ein genaueres Ergebnis erzielen können .

Normal Mapping : Auf der anderen Seite handelt es sich um eine Technik in der Computergrafik, die Normalen in einer Texturabbildung codiert, sodass jede Normale per Texel codiert wird. Es wird normalerweise zum Nachmachen der Beleuchtung von Unebenheiten und Beulen verwendet (z. B. Unebenheitskartierung, Parallaxenkartierung).

Da Normalen auf der Grundlage der geometrischen Eigenschaften des Netzes / der Oberfläche berechnet werden, bietet Normal Maps alternative Normalen, mit denen die Unebenheiten simuliert werden können, um der Oberfläche Details hinzuzufügen, ohne dass weitere Polygone hinzugefügt werden müssen.

Normale Karten werden normalerweise mit einem viel detaillierteren 3D-Modell erstellt. Anschließend werden die Normalen anhand dieses Modells berechnet und in einer normalen Karte codiert.

Warum brauchen wir beide?

Wenn Sie nur über das Rendern sprechen, werden Normalen und normale Karten normalerweise zusammen verwendet, um den endgültigen Beleuchtungseffekt zu erzielen. Ein gutes Beispiel könnte ein Bump-Shader sein, bei dem Sie die normale Karte benötigen, um den Bump-Beleuchtungseffekt zu erzielen geometrische Normale, um den sogenannten Tangensraum zu berechnen . Tangentialraum wird normalerweise verwendet, um die Wiederverwendbarkeit für normale Karten zu gewährleisten.

Denken Sie daran, dass eine Normale als geometrisches Attribut der Oberfläche betrachtet wird und weit mehr als nur Lichtberechnungen verwendet werden kann. Normale Karten hingegen werden normalerweise für oberflächliche Effekte verwendet.

Erweitere die Antwort, um zu erklären, warum tangentiale Räume wichtig sind:

Kurze Antwort: Tangentiale Räume werden verwendet, um normale Karten von der zugrunde liegenden Geometrie unabhängig zu machen.

[BEARBEITEN] Bild hinzugefügt, um eine normale Karte im Tangentialraum und eine normale Karte im Weltraum darzustellen.

Bildbeschreibung hier eingeben

Lange Antwort: Das folgende Bild zeigt die UV-Ebene und die Normale, die den Tangentenraum definiert. Wenn Sie eine normale Karte erstellen, wissen Sie bereits, dass auf dem verwendeten Raum die Normale immer in Z-Richtung zeigt (daher sehen normale Karten bläulich aus). Dies hilft uns, die Oberflächenkrümmung zu ignorieren.

Der tangentiale Raum bietet den Vorteil, dass unsere normale Kartencodierung nicht an bestimmte Mesh-Normalen gebunden ist. Angenommen, wir codieren unsere normale Karte im Welt- oder Objektraum. Jede von uns codierte Normale hat eine Richtung, die davon abhängt, wie sich die ursprünglichen Mesh-Normalen im Weltraum unterscheiden. Ganz zu schweigen davon, dass Ihre normale Karte von den Modelltransformationen betroffen ist.

Bildbeschreibung hier eingeben

In den beiden obigen Bildern ist es ziemlich klar, dass der Tangentenraum normale Karten (rechts) erstellt, unabhängig von der zugrunde liegenden Geometrie, da alle Normalen mit kleinen Abweichungen in nahezu derselben Richtung codiert werden, um den Effekt der Unebenheiten zu simulieren.

** Die Oberflächenkrümmung wird durch den Betrag definiert, um den ein geometrisches Objekt von der Ebenheit oder bei einer Linie von der Geradheit abweicht. Dies wird jedoch je nach Kontext auf unterschiedliche Weise definiert.

Tangentialraumdarstellung

concept3d
quelle
1
Wenn Sie ein Bild finden, das zeigt, wie eine normale Textur allein nicht konsistent verwendet werden kann, ohne dass ein normales und tangentiales Feld pro Scheitelpunkt definiert ist, ist dies die beste Antwort auf dieses rätselhafte Problem für die meisten Anfänger in der Grafikprogrammierung!
Teodron
Gute Antwort, aber Normalen werden von OpenGL nicht über jedes Gesicht interpoliert. Sie müssen es selbst tun und die interpolierte Norm an OpenGL (oder an Ihren Shader-Code) übergeben.
Anastasios G
1
@AnastasiosG Ich denke, er spricht über das Standardverhalten von variierenden Daten, wenn diese über ein Dreieck interpoliert werden, wenn ein Fragment für ein bestimmtes Grundelement berechnet wird. Ich weiß, dass es ein Flag gab, mit dem Sie OpenGL anweisen können, eine bestimmte Normalen aus den möglichen 3 Vertexnormalen eines Dreiecks zu verwenden, aber das ist nicht das Standardverhalten, das mir bekannt ist.
Teodron
1
@ AnastasiosG Ich dachte, dass solch ein Detail der Antwort keinen Gefallen tut, da es nicht darum geht, wie man OpenGL benutzt. Aber wenn das hilft, brauchten Sie in der Ära der festen Pipeline glShadeModel (GL_SMOOTH), um openGL anzuweisen, zu interpolieren. In der programmierbaren Pipeline-Ära definieren Sie die Variablen als variabel oder in / out im Shader, damit OpenGL interpolieren kann.
concept3d
Ich möchte hinzufügen, dass Bump Maps einfach (geometrische) Normalen sind, die auf der Basis einer Schwarz-Weiß-Textur angehoben / abgesenkt werden. :)
Entalpi