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.
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.
Antworten:
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.
vec3 normal = (colour - vec3(0.5)) * 2.0;
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:
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.
vec3 colour = vec3(0.5) + normal * 0.5;
Konvertiert dieser Code RGB in XYZ?