Wie bereits im letzten Artikel angekündigt, erweitere ich das Spektrum dieses Blogs um Themen aus (3D) Game Art. Den Anfang macht dieser Artikel über “Best Practices” für das UV-Unwrapping. Dies soll kein vollständiges Tutorial über UV-Unwrapping sein, sondern setzt voraus, dass du bereits grundlegende Erfahrungen damit hast und deine 3D-Modeling-Software soweit beherrschst, dass du die Tipps auch umsetzen kannst.
Für alle, die sich nur für die Regeln interessieren, habe ich sie auch direkt an den Anfang gestellt:
Die Best Practices im Detail
Für alle, die nicht alles einfach glauben wollen, was ich von mir gebe, oder sich generell für die Begründungen interessieren, geht es hier dann weiter. Die allumfassende Begründung für diese Regeln ist, dass es dabei darum geht, möglichst Fehler beim Texture-Baking, insbesondere dem Normal-Baking, zu vermeiden.
Jede harte Kante (Edge) muss ein UV-Cut sein, weiche Kanten können ein UV-Cut sein.

High-Poly-Cube für's Normal-Baking
Jede harte Kante muss ein UV-Cut sein, da es ansonsten zu Artefakten während des Normal-Bakings kommen wird. Umgekehrt gilt diese Regel nicht, auch wenn beim Hard-Surface-Modeling meist jeder UV-Cut gleichzeitig eine harte Kante ist. Stellen wir uns vor, wir haben einen High-Poly-Cube mit wunderschön abgerundeten Kanten, wie er hier abgebildet ist. Diese abgerundeten Kanten wollen wir nun auf einen einfachen Standard-Cube (8 Vertices, 12 Edges, 6 Faces) mit Hilfe des Normal-Bakings transferieren.
Um nun die These zu testen, habe ich zwei Standard-Cubes mit jeweils unterschiedlichen UV-Layouts vorbereitet. Das erste UV-Layout besteht nur aus einer einzelnen UV-Shell und könnte jedem aus dem Mathematikunterricht bekannt vorkommen. Das zweite Layout hingegen stellt das andere Extrem dar und benutzt für jede Fläche eine einzelne UV-Shell und folgt damit der hier besprochenen Regel, da jede Kante des Cubes eine harte Kante ist.

2 UV-Layouts für einen einfachen Cube (links: 1 UV-Shell ohne Padding; rechts: 6 UV-Shells mit Padding)
Mit den unterschiedlichen UV-Layouts habe ich dann die Normals des High-Poly-Cubes mit den identischen Einstellungen übertragen. Wie man im nachfolgenden Bild sehen kann, gibt es beim linken UV-Layout Überlagerungen an den Kanten, während im rechten UV-Layout alles soweit gut aussieht. Als kleiner Nebeneffekt des rechten UV-Layouts ist dort auch eine höhere höhere Texeldichte nutzbar.

Ergebnis des Normal-Bakings für die unterschiedlichen UV-Layouts (links: 1 UV-Shell ohne Padding; rechts: 6 UV-Shells mit Padding)
Die Außenkanten der einzelnen UV-Shells sollten im Idealfall perfekt gerade sein.

links: gerade Linie; rechts: Linie um 45º gedreht
Jeder ist bei den Grafikeinstellungen von Computerspielen bestimmt schon mal über den Begriff Kantenglättung (Anti-Aliasing) gestolpert und zur Auswahl stehen dann oft obskure Abkürzungen wie MSAA, FXAA, TAA, … und anschließend kommen dann teilweise noch Multiplikatoren (x4, x16, …). Dabei handelt es sich um Verfahren, die Einschränkungen unserer Bildschirme ausgleichen sollen. Aktuelle Monitore (LCD / (O)LED) sind pixelbasierend, was vereinfacht bedeutet, dass für uns bzw. die GameEngine ein Pixel die kleinstmögliche ansprechbare Einheit ist. Wir können immer nur einem ganzen Pixel eine Farbe zuweisen und nicht nur einem halben Pixel oder noch weniger. Wenn wir nun eine Kante haben, die von links nach rechts über den Bildschirm läuft, sehen wir eine perfekte Kante, da die Pixel alle direkt nebeneinander liegen und so einen perfekten Übergang ermöglichen. Drehen wir diese Kante bspw. um 45º, können wir deutliche Artefakte des Treppeneffekts erkennen, wie im nebenstehenden Bild gezeigt.
Um solche Artefakte zu verhindern, ist es essentiell, perfekte gerade Außenkanten zu haben und dabei werden auch leichtere Verzerrungen innerhalb der UV-Shells in Kauf genommen, da die Artefakte durch Aliasing oft stärker auffallen als leichte Verzerrungen innerhalb der UV-Shells. Dabei muss man beachten, dass solche Artefakte stärker auffallen je niedriger die Texturauflösung ist. Auch wenn im Beautyshot für das eigene Portfolio mit 4k-Texturen keine Probleme sichtbar sind, heißt es nicht, dass bei einer “Game ready”-Version mit bspw. 1k-Textur weiterhin keine Artefakte auftreten.
Die Shells sollten immer an den Achsen ausgerichtet sein.
Hier gilt an sich die gleiche Begründung wie beim Punkt zuvor. Wenn die UV-Shells an den Achsen ausgerichtet sind und perfekt gerade Außenkanten haben, sind die Außenkanten weiterhin perfekt gerade und es kann keinerlei Aliasing / Treppeneffekt auftreten. Gleiches gilt bei Drehungen in 90º-Schritten.
Es ist auf eine einheitliche Texeldichte zu achten.

Szene mit unterschiedlich hoher Texeldichte
Um an allen Stellen des Modells einen einheitlichen Detailgrad bei der Texturierung zu erreichen, ist eine einheitliche Texeldichte essentiell. Mit Texeldichte bezeichnet man die Anzahl an Pixeln pro Längeneinheit (meist px/cm) und bezieht sich dabei natürlich auf eine bestimmte Texturgröße, bspw. 2k. Bei der Bestimmung der aktuellen Texeldichte bzw. dem Setzen einer bestimmten Texeldichte gibt es für die gängige 3D-Modellierungssoftware entweder direkt eingebaute (bspw. bei Maya) oder via Plugin nachrüstbare (bspw. bei Blender) Tools.
Es lässt sich zusammenfassend sagen: Je höher die Texeldichte, desto höher ist der erreichbare Detailgrad, aber auch der notwendige Speicherverbrauch. Daher muss man, sofern man überhaupt selbst bestimmen darf, dabei immer abwägen, was der beste Kompromiss für das Gesamtergebnis ist. Dabei ist es unabdingbar, dass das gesamte Spiel eine möglichst einheitliche Texeldichte aufweist. Mehr zu diesem Thema gibt es unter Beyond Extend - Deepdive Texel density.
Es ist auf ein ausreichend großes Padding zu achten.
Bei der Anordnung der verschiedenen UV-Shells sollte immer auf ausreichend Abstand zwischen den UV-Shells geachtet werden. Grund dafür ist, dass es ohne ausreichendes Padding zu Problemen an den folgenden Stellen kommen kann:
- Normal-Baking
- Beim Normal-Baking mag dem ein oder anderen vielleicht schon der Begriff Dilatation untergekommen sein. Damit lässt sich meist konfigurieren, um wieviel px die UV-Shell eines Objekts überschritten werden darf. In den meisten Fällen werden dabei die äußersten Pixel der Normals einfach nach außen hin kopiert. Es wird genutzt, um möglichen Rendering-Fehlern durch bspw. Skalierung vorzubeugen (siehe MipMaps). Ohne ausreichendes Padding würden sich die Normals unterschiedlicher Shells dann überschreiben.
- MipMap-Erzeugung
- MipMaps sind Texturemaps, bei denen eine Textur in unterschiedlichen Auflösungen vorliegt und in einer Datei gespeichert wird. MipMaps sind wichtig, da es ansonsten zu Fehldarstellungen, bspw. dem Moiré-Effekt, kommen kann, wenn feinaufgelöste Muster, bspw. Streifen, aus der Ferne betrachtet werden. Um dies zu verhindern, werden Texturen in unterschiedlichen Auflösungen gespeichert, sodass die Rendering-Engine die “ideale” Auflösung in Abhängigkeit zur dargestellten Größe des 3D-Modells für die Anzeige benutzen kann.
MipMaps werden in der heutigen Zeit meist von den Game-Engines automatisch erzeugt, aber wer es darauf anlegt, das letzte Quäntchen an Qualität herauszuholen, kann sie mit den passenden Programmen auch manuell erstellen bzw. überarbeiten. Dabei ist zu beachten, dass dabei bspw. aus einer Textur mit 2048px Breite eine 512px breite Textur erzeugt werden muss, d.h. 4px werden zu 1px zusammengefasst, was ohne ausreichendes Padding dazu führen kann, dass Daten aus unterschiedlichen UV-Shells miteinander verrechnet werden.
Ausreichend ist dabei ein relativer Begriff, da es auf die anvisierte Texturgröße ankommt. Im PolyCount-Wiki werden folgende Mindestwerte für das Padding angegeben:
Texturgröße (px) | Padding (px) |
---|---|
256x256 | 2 |
512x512 | 4 |
1024x1024 | 8 |
2048x2048 | 16 |
Die goldenen Regeln
Und zum Abschluss nochmal die goldenen Regeln des UV-Unwrappings: