Wie funktioniert normales Mapping wirklich?


10

Ich versuche, das Konzept der normalen Zuordnung zu verstehen, bin aber durch einige Dinge verwirrt. Kurz gesagt, ich bin mir nicht sicher, ob eine normale Karte vom Ansichtspunkt abhängig ist oder nicht (dh ob Sie beim Drehen eine andere normale Karte desselben Objekts erhalten). Zweitens verstehe ich nicht, warum die bläuliche Farbe in normalen Karten die vorherrschende Farbe ist.

Wie ich über Normalen und ihre Beziehung zu RGB-Farben denke, ist wie folgt. Die Einheitskugel repräsentiert jede mögliche Einheitsnormalen - mit anderen Worten, die X-, Y- und Z-Komponenten eines Einheitsnormalenvektors reichen von -1 bis 1. Die Komponenten einer RGB-Farbe reichen alle von 0 bis 255. Daher ist dies sinnvoll um -1 (normale Komponente) auf 0 (Farbkomponente), 0 auf 127 oder 128 und 1 auf 255 abzubilden. Jeder Wert dazwischen wird nur linear interpoliert.

Das Anwenden dieser Abbildung auf die Normalen eines beliebigen 3D-Objekts führt zu einem sehr farbenfrohen Bild, das überhaupt nicht überwiegend blau ist. Wenn Sie beispielsweise einen Würfel nehmen, haben alle sechs Gesichter eine andere, aber einheitliche Farbe. Zum Beispiel wäre das Gesicht mit der Normalen (1,0,0) (255,128,128), das Gesicht mit der Normalen (0,0, -1) wäre (128,128,0) und so weiter.

Aus irgendeinem Grund sind die normalen Karten eines Würfels, den ich gefunden habe, vollständig bläulich, dh (128, 128, 255). Es ist jedoch klar, dass die Normalen nicht alle in der positiven z-Richtung liegen, dh (0,0,1). Wie funktioniert das?

[Bearbeiten]

Ok, der oben beschriebene Ansatz scheint also als normale Objektraumkarte oder normale Weltraumkarte bezeichnet zu werden . Die andere wird als Tangentenraum-Normalkarte bezeichnet . Ich verstehe, wie eine solche Tangentenraum-Normalkarte verwendet werden kann, um die Normalen einer Geometrie zu ändern, bin mir aber immer noch nicht ganz sicher, wie sie tatsächlich berechnet wird (siehe meinen Kommentar zu Nicol Bolas 'Antwort).

[Bearbeiten 2]

Ich sollte wahrscheinlich erwähnen, dass ich mit stückweise parametrischen Oberflächen arbeite. Diese Oberflächen bestehen aus einer Reihe von Oberflächenfeldern , wobei jedem Feld ein eigener Parameterraum (u, v) = [0,1] x [0,1] zugeordnet ist. An jedem Punkt der Oberfläche kann die Normalen genau berechnet werden. Anscheinend sind die Vektoren T ( Tangente ) und B ( Bi-Tangente ) - die erforderlich sind, um den Tangentenraum zu überspannen - nicht einfach die partiellen Ableitungen des Oberflächenfeldes in Richtung von u und v ...


Haben Sie jemals versucht, Phong oder zumindest diffuse Schattierungen zu implementieren? Kennen Sie Grundformeln wie Punkt (a, b) = cos (Winkel (a, b)) für Einheitsvektoren a, b? Wenige Stunden der Implementierung würden Ihnen jahrelange Probleme ersparen.
Ivan Kuckir

@Ailurus: Siehe meinen Kommentar / meine Antwort, wie man das gleiche Problem für Geländeobjekte / Höhenfelder angeht. Für andere Objekte wird es etwas komplizierter, aber die Konzepte sollten sich nicht unterscheiden.
Teodron

Der besondere Fall von Gelände normalen mappping: gamedev.stackexchange.com/questions/43894/...
teodron

Antworten:


14

Eine Texturabbildung ist die Zuordnung zwischen Punkten auf der 3D-Oberfläche und ihren entsprechenden Punkten auf einem Texturbild. Wenn Sie eine 1: 1-Texturabbildung haben, wird jeder Punkt auf der 3D-Oberfläche einem bestimmten und eindeutigen Punkt im Texturbild zugeordnet (obwohl das Gegenteil nicht der Fall sein muss. Einige Positionen in der Textur müssen nicht unbedingt Positionen zugeordnet werden an der Oberfläche).

Mit einer solchen Zuordnung können Sie die 3D-Oberfläche durchlaufen und jede einzelne Normalen an der entsprechenden Stelle in der Textur speichern.

OK gut, lass uns das machen. Wir gehen durch eine 3D-Oberfläche und erzeugen Objektraumnormalen der abgebildeten Positionen und kleben sie dann in die Textur. Wenn wir also rendern möchten, holen wir einfach den normalen Objektraum aus der Textur und fertig. Recht?

Na ja, das würde funktionieren. Es bedeutet aber auch, dass die Normalen der Textur immer nur für dieses bestimmte Objekt verwendet werden können. Dies bedeutet auch, dass die Normalen der Textur nur mit diesem Objekt und mit dieser spezifischen Texturabbildung verwendet werden können . Wenn Sie also das Textur-Mapping auf irgendeine Weise drehen oder durch eine UV-Transformation ändern möchten, haben Sie kein Glück.

Im Allgemeinen werden also normale Karten verwendet, bei denen sich die Normalen im "Tangentenraum" befinden. Der Tangentenraum ist der Raum relativ zum abgebildeten Punkt auf der 3D-Oberfläche, wobei die nicht modifizierte Normale in der + Z-Richtung liegt und die X- und Y-Achse entlang der U- und V-Achse relativ zur Oberfläche zeigen.

Der Tangentenraum reguliert im Wesentlichen die Normalen. Im Tangentenraum bedeutet das Normale (0, 0, 1) immer "unverändert"; Es ist die Normalität, die Sie durch Interpolation der Scheitelpunktnormalen erhalten. Dies führt zu einer Reihe nützlicher Dinge, die Sie tun können. Eine der wichtigsten ist, sie in weniger Daten zu speichern.

Da das Z immer positiv ist, können Sie es in Ihrem Shader aus den X- und Y-Komponenten berechnen. Da Sie nur 2 Werte benötigen, können Sie (in der OpenGL-Bildformat-Nomenklatur ) GL_RG8ein 2-Byte-pro-Pixel-Format anstelle GL_RGBA8eines 4-Byte-pro-Pixel -Formats ( GL_RGB8immer noch 4-Byte-pro-Pixel) verwenden , da GPUs jedes Pixel auf 4 Bytes auffüllen). Noch besser ist, dass Sie diese beiden Werte komprimieren können , was zu einem 1-Byte-pro-Pixel-Format führt. Sie haben also die Größe Ihrer Textur auf 75% der normalen Karte des Objektraums reduziert.

Bevor Sie über eine normale Karte sprechen können, müssen Sie zunächst wissen, was darin gespeichert ist. Ist es eine Objekt-Raum-Normalkarte, eine Tangentenraum-Normalkarte oder etwas anderes?


Okay, der erste Kartentyp, den Sie beschreiben, ist eine normale Objektraumkarte , oder? Dies ist die farbenfrohere, da sie die realen X-, Y- und Z-Komponenten der Normalen speichert. Der zweite Typ, die Tangentenraum-Normalkarte , scheint eher die Störungen der Normalen als die Normalen selbst zu speichern. Ich werde mich über das Konzept eines Tangentenraums informieren und später noch einmal nachsehen.
Ailurus

Ok, der Tangentenraum eines Punktes auf der Oberfläche ist einfach der Raum aller Tangentenvektoren dieses Punktes. In diesem Fall sehe ich jedoch nicht, wie die Normalität aus Sicht des Tangentenraums etwas anderes sein kann als (0,0,1)? Mit anderen Worten, ich würde immer erwarten, dass die normale Karte gleichmäßig blau ist (128.128.255). Das auf der Wikipedia-Seite gezeigte Beispiel ( en.wikipedia.org/wiki/Normal_mapping#How_it_works ) enthält jedoch andere Farben. Ich verstehe, wie diese Karte verwendet werden kann, um die Normalen zu ändern, aber nicht, wie sie tatsächlich berechnet wird.
Ailurus

@Ailurus: " Ok, der Tangentenraum eines Punktes auf der Oberfläche ist einfach der Raum aller Tangentenvektoren dieses Punktes. " Nein, das ist es nicht. Dies ist der Raum, der durch die (unveränderte) Normale und die Richtung der Texturkoordinaten an diesem Punkt auf der Oberfläche definiert ist. Es regulierte die in der Textur gespeicherte Normalen als relativ zur Texturabbildung und zur aktuellen Normalen vor Änderungen.
Nicol Bolas

Der wahrscheinlich schwierigste Teil einer normalen Karte ist die Abbildung selbst (einschließlich der Berechnung der Tangentenvektoren). Ist die Berechnung der Tangentenvektoren nicht eng mit der UV-Abbildung / Umhüllung der diffusen Textur UND der Geometrie des Objekts insgesamt verbunden? Anders ausgedrückt: Sie haben zwei verschiedene normale Karten für ein Objekt, aber nur ein tangentiales (und normales) Feld berechnet. Möglicherweise stellen Sie fest, dass Sie das Tangentenfeld nicht konsistent mit zwei verschiedenen normalen Texturen verwenden können (obwohl Sie geometrisch geeignete UV-Zuordnungen finden könnten, was keine triviale Aufgabe ist).
Teodron

@NicolBolas Ah, ich war verwirrt, weil einige Quellen behaupten, dass die Vektoren T, B und N eine orthonormale Basis bilden, während andere erwähnen, dass dies nicht unbedingt wahr ist.
Ailurus

3

Normale Karten werden unter Verwendung des sogenannten Tangentenraums abgebildet, der im Wesentlichen ein lokaler Raum ist, der auf dem Texturraum des Modells basiert. Dies sollte Ihre beiden Fragen beantworten.

Es ist nicht vom Standpunkt abhängig, da dieser Raum nichts mit der Kamera zu tun hat. In der normalen Karte ist Z die Aufwärtsrichtung. Wenn Sie sich die Normalen eines Modells ansehen, zeigen die meisten Normalenvektoren direkt aus dem Netz. Die Oberfläche des Netzes ist der Texturraum, über den ich gesprochen habe. In diesem lokalen Koordinatensystem ist also oben die Richtung nach außen.


Vielen Dank für die Klarstellung! Ich verwende jedoch kein polygonales Netz als Oberfläche, sondern eine stückweise glatte parametrische Oberfläche . Daher würden alle Normalen als in die (0,0,1) -Richtung zeigend gespeichert, oder?
Ailurus

1

Scrollen Sie auf dieser Seite nach unten

Schauen Sie sich die rechte Schwarzweißzeichnung unter Datensätzen an - dies ist (oder war zumindest früher bekannt) eine Igelzeichnung, eine Darstellung einer Oberfläche, bei der jede ihrer Normalen gezeichnet ist

Um eine traditionelle normale Karte zu verstehen, stellen Sie sich einen verärgerten Igel vor, bei dem alle Stacheln herausragen - jeder dieser Stacheln ist normal zur Oberfläche des Igels darunter.

In Bezug auf Ihre Kugelfrage würde, wenn Sie wie bei Raytracern nur im parametrischen Raum leben würden, die unendliche Menge von Normalen zur Kugel einfach eine größere Kugel erzeugen - im tessellierten Raum, dh in der Welt, die der Computer uns aufzwingt, wenn Wir wollen Echtzeit, dann haben Sie eine stachelige Annäherung an eine Kugel.

Dieses Beispiel konzentrierte sich nun auf eine OBJEKT-Normalkarte - sie definiert Normalen in Bezug auf das Objekt und ist bei jeder Drehung, Verschiebung oder Skalierung - entweder des Objekts oder der Kamera oder irgendetwas anderem - unveränderlich - wie bereits erwähnt nur eine Art von normaler Karte, aber es ist die häufigste


0

Ich denke, Sie haben möglicherweise einige falsche Vorstellungen darüber, was normale Karten sind. Im Grunde ist es eine Möglichkeit, das Aussehen von etwas Unebenem zu simulieren, wenn die Geometrie tatsächlich vollständig flach ist.

Die Farben einer normalen Karte werden von einem Tech-Shader interpretiert und basierend auf Lichtintensität und -richtung sowie Ihrer Kameraansicht verarbeitet. Dies bedeutet, dass Sie beispielsweise einen Ziegelboden haben könnten, der vollständig flach ist und eine flache Textur aufweist. Da er jedoch eine normale Karte mit derselben Ziegelform aufweist, scheint das Licht von der Seite zu reflektieren, wenn Sie sich umschauen von den Steinen, die es mehr 3D aussehen lassen als es ist.

Dies ist natürlich nur eine Illusion, aber es ist viel billiger als eine komplexe Geometrie. Und nein, die Farben der normalen Karte ändern sich nicht. Sie stellen wirklich nur Werte dar, mit denen im Shader verglichen werden kann. Ich bin sicher, dass jemand hier Sie ausführlicher ausfüllen kann.


Ich weiß, aber trotzdem danke für deine Antwort :)
Ailurus
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.