Warum sind normale Karten blau und lila?

11

Ich lerne etwas über normales Mapping. Ich habe verstanden, dass RGB-Werte in XYZ konvertiert werden, aber meine Frage ist, wie sie konvertiert werden und warum die normale Karte blau und lila ist.

Abhinay Singh Negi
quelle

Antworten:

12

Da eine normale Karte Vektoren von -1 bis 1 abdeckt, ist es sinnvoll, diesen Bereich auf 0-> 1 zu strecken, damit alles in den Bereich von RGB passt.

Normalerweise wenden wir eine Transformation auf das Normale an, um es in etwas umzuwandeln, das wir sehen können.

vec3 colour = vec3(0.5) + normal * 0.5;

Die blaue Farbe ist darauf zurückzuführen, dass normale Karten relativ zur primitiven Normalen (Dreieck / usw.) mit einer Standardrichtung (0,0,1) verwendet werden sollen, um keine Abweichung von der Dreiecksnormalen anzuzeigen. Normalerweise muss der Fragment-Shader diese Normalen im Verhältnis zur aktuellen Normalen pro Pixel zur Laufzeit drehen.

PaulHK
quelle
vec3 colour = vec3(0.5) + normal * 0.5;Konvertiert dieser Code RGB in XYZ?
Abhinay Singh Negi
1
@AbhinaySInghNegi nein, Farbe ist RGB und normal ist XYZ, also wird XYZ in RGB konvertiert. Wenn Sie möchten, dass RGB XYZ ist, verwenden Sievec3 normal = (colour - vec3(0.5)) * 2.0;
bram0101
20

Nur Tangentialraum-Normalkarten sind hauptsächlich blau. Dies liegt daran, dass die Farbe Blau eine Normale von (0,0,1) darstellt, die eine unveränderte Normalität wäre, wenn das Dreieck in der Ebene x und y liegt, dh senkrecht zur Oberfläche. Die Tangente x und die Bi-Tangente y (auch als Bi-Normal bezeichnet) werden in den roten und grünen Kanälen codiert und bilden so die Form einer Tangentenraumnormalen für einen Punkt auf der Oberfläche des Dreiecks.

Wenn eine Tangentenraum-Normalkarte eine Farbe nur in Rot (1,0, 0,0, 0,0) codieren würde, würde dies eine Tangentenraum-Normale parallel zur Dreiecksoberfläche erzeugen. Dies wird nie gesehen, da dies bedeuten würde, dass das Dreieck immer nur bei 90 Grad von der Oberfläche und dem Ansichtsvektor beleuchtet wird, an welchem ​​Punkt Sie das Dreieck sowieso nicht sehen können.

Normale Karten des Weltraums codieren die Einheitsnormalen über einer Kugel, sodass sie in erster Linie unterschiedliche Farben haben können, sobald sie von [-1, 1] bis [0, 1] pro Kanal codiert sind.

Ein Vergleich ist hier zu sehen:

Geben Sie hier die Bildbeschreibung ein

In der Praxis werden normale Karten normalerweise in einem 2-Kanal-Format wie BC5 codiert, das tatsächlich nur das x und y speichert, wobei das z rekonstruiert wird, da wir wissen, dass es ein Einheitsvektor ist. Auf diese Weise können Sie eine höhere Genauigkeit mit mehr Bits beibehalten, ohne die Dateigröße zu erhöhen.

Syntac_
quelle
Tangentenräume sind nicht eindeutig parametrisiert, dennoch finde ich viele Bilder von Maschen + normalen Karten im Tangentenraum. Gibt es eine konventionelle Möglichkeit, die Tangentenraumbasis zu definieren?
Alec Jacobson