Normal Maps sind eine der wirkungsvollsten Techniken beim Echtzeit-Rendering. Sie ermöglichen es flachen Polygon-Oberflächen, komplexe Oberflächendetails darzustellen — Unebenheiten, Rillen, Kratzer, Poren — ohne ein einziges zusätzliches Dreieck zum Mesh hinzuzufügen. Eine Normal Map ist ein RGB-Bild, bei dem jedes Pixel die Richtung kodiert, in die eine Oberfläche an diesem Punkt zeigt, und der Renderer verwendet diese Information, um Beleuchtung zu berechnen, als wäre die Geometrie weit detailreicher als sie tatsächlich ist.
Wie Normal Maps Richtungen kodieren
Jedes Pixel in einer Normal Map speichert einen 3D-Richtungsvektor, der in drei Farbkanäle gepackt ist. Der Rot-Kanal kodiert die X-Achse (Links-Rechts-Neigung), der Grün-Kanal kodiert die Y-Achse (Oben-Unten-Neigung), und der Blau-Kanal kodiert die Z-Achse (wie stark die Oberfläche gerade nach außen zeigt). Eine flache Oberfläche, die direkt zur Kamera zeigt, hat eine Normale von (0, 0, 1), die im RGB-Farbraum auf (128, 128, 255) abgebildet wird — das charakteristische Blau-Lila, das man in jeder Normal Map sieht.
Die Mapping-Formel ist unkompliziert: Jeder Kanal speichert Werte von 0 bis 255, die den Bereich −1,0 bis +1,0 darstellen. Ein Wert von 128 bedeutet 0 (keine Neigung), 0 bedeutet vollständige Neigung in negativer Richtung, und 255 bedeutet vollständige positive Neigung. Der Renderer entpackt diese Werte zurück in Gleitkomma-Vektoren und verwendet sie in Beleuchtungsberechnungen anstelle der geometrischen Normalen.
Tangent Space vs. Object Space
Tangent-Space-Normal-Maps
Tangent-Space-Normal-Maps sind bei weitem der häufigste Typ. Sie definieren Oberflächenperturbation relativ zur eigenen Ausrichtung des Polygons, unter Verwendung eines aus Oberflächen-Tangente, Bitangente und geometrischer Normalen aufgebauten Koordinatensystems. Da die Richtungen relativ sind, funktioniert dieselbe Tangent-Space-Normal-Map korrekt auf jeder Oberflächenausrichtung — sie kann auf einem Boden, einer Wand oder einem gebogenen Objekt angewendet werden und die Beleuchtung reagiert korrekt.
Tangent-Space-Maps erscheinen immer überwiegend blau, da die meisten Pixel ungefähr nach außen zeigen (Z-Achse dominant). Kleine Variationen in Rot und Grün kodieren die feinen Oberflächendetails.
Object-Space-Normal-Maps
Object-Space-Normal-Maps speichern absolute Richtungen relativ zum lokalen Koordinatensystem des Objekts. Sie erscheinen regenbogenfarben, da Normalen in alle Richtungen zeigen. Object-Space-Maps sind einfacher zu rendern (keine Tangent-Frame-Berechnung) und vermeiden Tangent-Space-Artefakte an UV-Nähten, sind aber an ein bestimmtes Mesh gebunden. Verformung oder Wiederverwendung des Meshes bricht die Beleuchtung. Sie werden gelegentlich für statische Architektur oder Terrain verwendet.
Normal Maps vs. Displacement Maps
Normal Maps beeinflussen nur die Beleuchtung — sie bewegen keine Geometrie. Das bedeutet, Silhouettenkanten bleiben perfekt glatt, und Parallaxeffekte fehlen. Eine Backsteinwand mit einer Normal Map sieht von vorne uneben aus, hat aber ein flaches Profil bei streifenden Winkeln. Displacement Maps bewegen tatsächlich Vertices und erzeugen echte geometrische Tiefe mit korrekten Silhouetten und Selbstverdeckung. Der Kompromiss ist der Aufwand: Displacement erfordert dichte Tessellierung und ist beim Echtzeit-Rendering kostspielig.
Für die meisten Echtzeit-Anwendungen bieten Normal Maps das beste Qualitäts-Performance-Verhältnis. Verwenden Sie Displacement nur für Hero-Oberflächen in Nahaufnahme, bei denen Silhouettengenauigkeit wichtig ist, oder in Offline-Renderern wie Cycles oder Arnold, wo Tessellierungskosten akzeptabel sind.
Normal Maps aus Heightmaps generieren
Eine Heightmap (Graustufen, weiß = hoch, schwarz = niedrig) kann durch Berechnung des Oberflächengradienten an jedem Pixel in eine Normal Map umgewandelt werden. Der Algorithmus tastet benachbarte Pixel ab, um die Steigung in X und Y zu bestimmen, und konstruiert dann einen Normalvektor aus diesen Steigungen. Das Normal-Map-Tool auf Texturize tut genau dies — laden Sie eine Graustufen-Heightmap oder -Textur hoch, und es generiert eine Tangent-Space-Normal-Map mit einstellbarer Stärke.
Der Stärkeparameter steuert, wie steil die wahrgenommenen Unebenheiten sind. Niedrigere Stärkewerte erzeugen subtile Oberflächenvariation (gut für glatte Materialien wie polierten Marmor), während höhere Werte tiefe Rillen und ausgeprägte Unebenheiten erzeugen (ideal für rauen Stein oder Rinde).
Häufige Fehler
- Falscher Farbraum — Normal Maps müssen als lineare (Non-Color) Daten importiert werden, niemals als sRGB. Falscher Farbraum erzeugt ausgewaschene oder übertriebene Beleuchtung.
- Umgekehrter Grünkanal — OpenGL und DirectX verwenden entgegengesetzte Y-Achsen-Konventionen. Wenn Ihre Normal Map invertiert aussieht (Unebenheiten erscheinen als Vertiefungen), invertieren Sie den Grünkanal. Blender und die meisten DCC-Tools verwenden OpenGL-Konvention; Unreal Engine verwendet DirectX.
- Baking bei falscher Auflösung — Normal Maps, die von High-Poly- auf Low-Poly-Meshes gebacken werden, benötigen ausreichende Auflösung, um feine Details zu erfassen. Zu wenig aufgelöste Bakes erzeugen eckig wirkende Normalen.
- Übermäßige Stärkewerte — Eine zu hohe Normal-Map-Stärke lässt Oberflächen künstlich rau aussehen und erzeugt sichtbare Facettierung unter spekularer Beleuchtung.
Praktische Tipps
Kombinieren Sie eine Basistextur vom Ziegel-Generator oder Kopfsteinpflaster-Generator mit einer abgeleiteten Normal Map für ein vollständiges Material-Setup. In Blender verbinden Sie die Normal Map über einen Normal-Map-Node, der auf Tangent Space eingestellt ist. In Unreal Engine verbinden Sie sie mit dem Normal-Eingang des Materials, nachdem Sie mit einem Normal-Map-Ausdruck abgetastet haben. Testen Sie Ihre Normal Maps unter mehreren Beleuchtungswinkeln — ein Richtungslicht um die Oberfläche zu drehen, enthüllt alle Baking-Fehler oder Kanal-Probleme.