Was genau ist UV- und UVW-Mapping?

26

Beim Versuch, einige grundlegende 3D-Konzepte zu verstehen, versuche ich im Moment herauszufinden, wie Texturen tatsächlich funktionieren. Ich weiß, dass UV- und UVW-Mapping Techniken sind, die 2D-Texturen auf 3D-Objekte abbilden - Wikipedia hat mir das auch erzählt. Ich habe nach Erklärungen gegoogelt, aber nur Tutorials gefunden, die davon ausgegangen sind, dass ich bereits weiß, was es ist.

Meines Wissens besteht jedes 3D-Modell aus Punkten und mehrere Punkte ergeben ein Gesicht? Verfügt jeder Punkt oder jede Fläche über eine sekundäre Koordinate, die der Ax / Y-Position in der 2D-Textur entspricht? Oder wie manipuliert das Auspacken das Modell?

Was macht das W in UVW wirklich, was bietet es über UV? Wie ich es verstehe, ist W auf die Z-Koordinate abgebildet, aber in welcher Situation hätte ich unterschiedliche Texturen für dasselbe X / Y und unterschiedliches Z, wäre der Z-Teil nicht unsichtbar? Oder verstehe ich das völlig falsch?

Michael Stum
quelle
1
zwei Fragen getrennt stellen
Noob Game Developer
1
Ich hasse Leute wie @NoobGameDeveloper, alle anderen beantworten die Frage und alles, was sie tun, ist, Dinge herauszufinden, die mit der Frage nicht stimmen. Komm, lass sie Fragen stellen, ich sage nicht, dass niemand die Regeln befolgen sollte, aber solche Fragen sind völlig in Ordnung, um hier gepostet zu werden.
Daniyal Azram

Antworten:

23

Ihr Verständnis ist nah. Jedes 3D-Modell besteht aus Eckpunkten. Jeder Scheitelpunkt definiert normalerweise die Position eines Punkts im Raum, eine Normale (die für Beleuchtungsberechnungen verwendet wird) und eine oder mehrere Texturkoordinaten. Diese werden allgemein als u für den horizontalen Teil der Textur und v für den vertikalen Teil bezeichnet.

Wenn ein Objekt texturiert ist, werden diese Koordinaten verwendet, um nachzuschlagen, welches Texel oder Pixel aus der Textur geplottet werden soll. Ich finde es am einfachsten, sie als Prozentsätze oder Verhältnisse zwischen dem linken Rand der Textur ( u = 0) und dem rechten Rand der Textur ( u = 1,0) und dem oberen Rand der Textur ( v = 0) und dem unteren Rand zu betrachten davon ( v= 1,0). Sie werden zwischen den Eckpunkten interpoliert und nach jedem auf dem Bildschirm angezeigten Pixel durchsucht, das gerendert wird. Sie können größer oder kleiner als diese Bereiche sein, und der beim Rendern des Objekts festgelegte Renderstatus gibt an, was passiert. Die Optionen hierfür sind CLAMP und REPEAT. Durch das Festklemmen wird die Koordinate entweder auf 0 oder 1 begrenzt, wodurch die Textur außerhalb des Bereichs verschmiert. Wiederholen bewirkt, dass sich die Textur wiederholt, wenn sie außerhalb des Bereichs liegt. Es ist praktisch dasselbe, als würde man nur den Dezimalteil der Koordinate erfassen und an seiner Stelle verwenden.

Bevor die Texturkoordinaten auf ein Objekt angewendet werden, werden sie mit einer Texturmatrix multipliziert, um eine Transformation auf sie anzuwenden (z. B. Skalieren, Verschieben oder Drehen). Dieser Effekt wird manchmal in Spielen animiert, um den Eindruck zu erwecken, als würde sich etwas über ein Objekt bewegen, ohne dass das Objekt selbst bewegt werden muss. Die Textur rollt einfach darüber. Wenn die Texturmatrix mit den Texturkoordinaten multipliziert wird, werden 2 Werte erzeugt, die zum Nachschlagen des zu zeichnenden Texels verwendet werden (nennen wir sie s und t ). Diese werden automatisch aus u und v generiert, auch wenn die Texturmatrix nicht gesetzt ist. Dies entspricht der Multiplikation von u und v mit einer Identitätsmatrix.

Hier kommt die w- Koordinate ins Spiel, obwohl sie nicht so oft verwendet wird. Es ist ein zusätzlicher Parameter zum Multiplizieren der Texturmatrix und wird normalerweise verwendet, wenn Sie die Perspektive berücksichtigen möchten (z. B. in Shadow Mapping ). Dies funktioniert genauso, als würden Sie einen Ort im Objektraum über eine Weltbildprojektionsmatrix in einen Bildschirmraum umwandeln. Wenn Sie das UVW mit einer Projektionstransformation multiplizieren, erhalten Sie 2 Koordinaten, das s und das t, die dann auf eine 2D-Textur abgebildet werden.

Joel Baker
quelle
Es ist erwähnenswert, dass OpenGL v0 als unterste und v1.0 als oberste behandelt. Das hat mich in der Vergangenheit viel Zeit gekostet, als ich den Fehler nicht finden konnte, als meine Texturen seltsam aussahen.
Tkausl
8

Betrachten Sie ein Dreieck.

Jede Ecke hat eine UV-Koordinate. Zwischen diesen interpolieren Sie, um für jedes Pixel einen Satz UV-Koordinaten zu erhalten. (Es gibt hier auch eine Perspektive, aber lassen Sie uns diese für den Moment ignorieren.)

Dann holen Sie ein Texel aus der Textur aus den Koordinaten U und V. Das heißt, ein Pixel aus der Texturkoordinate x, y - dasselbe, etwas andere Terminologie, da es sich um Texturen handelt.

Wenn Ihre Textur wirklich dreidimensional ist, benötigen Sie auch eine dritte Koordinate, W.

Eine Möglichkeit, dies zu visualisieren, besteht darin, sich einen Holzblock vorzustellen. Wenn Sie es irgendwie hacken, werden Sie sehen, dass jede Ebene innerhalb des Blocks eine Art 2D-Textur enthält.

3D-Texturen sind so selten, dass man sie vorerst vergessen kann.

Jari Komppa
quelle
Selten? Wofür werden sie verwendet? Können Sie ein Beispiel im Zusammenhang mit AAA-Titeln zeigen?
Quazi Irfan
Nein, weil sie im Allgemeinen nie benutzt werden. Es gibt immer eine billigere Möglichkeit, dasselbe zu tun. Denken Sie an die gehackten Gegenstände in wii sports plus; Sie können die Elemente auf beliebige Weise aufteilen und die "Einbauten" anzeigen. Sie hätten viel Speicher verschwenden können, wenn sie 3D-Texturen erstellt hätten (vorausgesetzt, die Hardware unterstützt dies sogar), aber es ist viel billiger, dies mit ein paar 2D-Texturen zu simulieren.
Jari Komppa
Sie sind also nicht exklusiv? oder ist diese Funktion nicht unbedingt für bekannte Aufgaben der Game Engine erforderlich?
Quazi Irfan
Ich verstehe nicht, was du meinst. 3D-Texturen können jedoch auch für andere Zwecke als nur als Texturen nützlich sein. Wenn einige Daten, die ein Shader benötigt, bequem in ein 3D-Array abgebildet werden, ist dies eine Verwendung. Aber als "normale" Textur sind sie im Allgemeinen nur eine Verschwendung von Gedächtnis.
Jari Komppa
Eine Anwendung einer 3D-Textur ist das Distanz-Mapping, obwohl sie, wie Jari sagt, aufgrund ihrer Komplexität in einem Spiel sehr ungewöhnlich sind. [link] http.developer.nvidia.com/GPUGems2/gpugems2_chapter08.html
Jackalope
7

Denken Sie an Origami.

Eine UV-Karte ist wie eine abgeflachte (nicht umwickelte) 2D-Skin Ihres 3D-Netzes (Shell).

Wenn Sie die Karte ausschneiden und entlang der Netzlinien falten würden, wäre das Ergebnis Ihr 3D-Modell.

Die (U, V) Gleitkommawerte reichen von (0,0) bis (1,1). Die obere linke Ecke der UV-Karte ist (0,0). Die untere rechte Ecke ist (1,1).

Jeder Scheitelpunkt in einem Polygonnetz (Tris / Quads) hat einen (U, V) -Wert, der dem Renderer mitteilt, welcher Teil der Karte verwendet werden soll.

In der GPU-Pipeline berechnen Vertex-Shader die 2D-Projektionen jedes Pixels in diesen 3D-Polygonen und färben sie dann mithilfe der UV-Karte durch Fragment-Shader ein.

Dies kann ohne ein Bild wie dieses nicht vollständig gewürdigt werden, was alles offensichtlich macht:

UV-Mesh

Wie die anderen Kommentatoren bereits erwähnt haben, wird die W-Komponente vom Renderer für ausgefallenere Effekte wie Shadow Mapping verwendet, aber die UV-Map ist die Grundlage für das Verständnis.

Beachten Sie, dass ein Vertex-Shader für jedes Pixel, das eingefärbt werden muss, mindestens einmal einen Fragment-Shader aufrufen muss. Deshalb sind GPUs Parallelprozessoren mit Dutzenden von Kernen - die Shader-Pipeline ist sehr anspruchsvoll.

Bitte beachten Sie auch, dass in die CPU integrierte GPUs für Mobilgeräte entwickelt wurden und auf weniger als ein Zehntel der Anzahl der Kerne beschränkt sind als externe GPUs der gleichen Generation. Dies liegt an den Einschränkungen der Stromversorgung und der Kühlung des Mobilgeräts. Moores Gesetz scheint sich verlangsamt zu haben, aber die Leistung verbessert sich immer noch (mit dem merkwürdigen Zusammenbruch hier und da ..)

Das UV-Mapping von Milliarden von Pixeln bei mehr als 240 Bildern pro Sekunde kann ein echtes Durcheinander verursachen!

Dominic Cerisano
quelle
0

Eine UV-Karte ordnet einen Punkt (x, y, z) im Netz einem Punkt (u, v) im Texturbild zu. Da ein Bild (u, v) einer Farbe zuordnet, können die beiden Abbildungen verkettet werden, wodurch sich eine Abbildung vom Netzraum zum Farbraum ergibt.

         uv map       color map
 (x,y,z)   ->   (u,v)    ->     color
 mesh           Texture
 space          space
Golopot
quelle