Zurück zum Blog
Tutorials

Normal Map Conventions: OpenGL vs DirectX erklärt

Warum deine Normal Map in Unreal invertiert aussieht, aber in Unity perfekt — eine verständliche Erklärung der Tangent-Space Y-Achsen-Konventionen mit konkreten Lösungen.

Admin23. April 20263 Min. Lesezeit11

Du legst eine Normal Map in Unreal an und die Oberfläche wird beleuchtet, als würde die Sonne von unten scheinen. Du steckst dieselbe Datei in Unity oder Blender — sieht großartig aus. Das Mesh ist identisch. Die Textur ist identisch. Was ist hier los?

Zwei Industrien, eine Achsen-Uneinigkeit

Normal Maps speichern eine Oberflächenrichtung in ihren RGB-Kanälen. Rot = X, Grün = Y, Blau = Z. Jede PBR-Engine dekodiert sie auf die gleiche Weise mit einer Ausnahme: das Vorzeichen von Y.

OpenGL-Konvention (Y+): ein hellerer grüner Kanal bedeutet, die Oberfläche zeigt nach oben. Wird von Unity, Godot, Blender (Cycles und Eevee), Substance Painters Standard-Export und jedem WebGL-basierten Engine verwendet.

DirectX-Konvention (Y−): helleres Grün bedeutet, die Oberfläche zeigt nach unten. Wird von Unreal Engine, dem Legacy-Direct3D-Toolchain und einigen CryEngine-/Xbox-Ära-Assets verwendet.

Gleiche Bytes in der PNG. Entgegengesetzte physikalische Bedeutung.

Wie man es auf einen Blick erkennt

Schau dir einen hemispärischen Bump (wie einen Knopf oder eine Kuppel) in deiner Normal Map an. In der OpenGL-Konvention ist der Boden des Bumps dunkler grün, weil sich die Oberfläche in Richtung Y− dreht, weg vom Licht. In der DirectX-Konvention ist der Boden heller grün.

Wenn deine Beleuchtung in der Engine falsch aussieht — Highlights wo Schatten sein sollten — hast du einen Konventions-Konflikt.

Die Lösung dauert 5 Sekunden

In Unreal hat der Textur-Import-Dialog ein Flip Green Channel Kontrollkästchen. Schalte es ein und die Engine invertiert den G-Kanal bei Abtastzeit. Du musst deine Quelle nicht neu exportieren.

In Unity stelle den Texturtyp auf Normal map ein und der Importer kümmert sich um alles — Unity erwartet OpenGL, warnt dich aber, wenn die Datei falsch aussieht. In Blender verwende eine Separate Color → Invert G → Combine Color Node-Kette, oder wähle einfach direkt DirectX-förmige Eingabe im Normal Map Node.

Warum zwei Standards überhaupt?

In den 1990ern definierten OpenGL und DirectX entgegengesetzte Texturkoordinatenräume — OpenGL hatte Y erhöht sich nach oben, DirectX hatte Y erhöht sich nach unten. Als Normal Maps Mitte der 2000er Jahre verbreitet wurden, buk jede Toolchain seinen Raum in ihre Ausgaben. Die Divergenz blieb bestehen, weil das Umkehren einer etablierten Pipeline teuer ist.

Normal Maps generieren ohne die Verwirrung

Der aukimi Normal Map Generator lässt dich die Konvention beim Export explizit wählen. Er führt einen Sobel-Gradienten auf der Luminanz deiner Höhenkarte durch, packt dann (−dx·s, −dy·s, 1) in RGB — mit Y geflippt wenn du DirectX wählst. Du kannst die Konvention nach der Generierung umschalten und neu herunterladen, ohne etwas neu hochzuladen.

Intern ist die Formel identisch. Der einzige Unterschied ist das Vorzeichen, das wir auf die Y-Komponente vor dem Schreiben des grünen Kanals anwenden. Wenn du das weißt, kannst du eine Datei zwischen Konventionen mit jedem Bildeditor konvertieren: öffne die PNG, wähle den grünen Kanal, invertiere ihn, speichern. Das ist alles, was "Flip Green Channel" in Unreal macht.

Schnellreferenz

  • Unity, Godot, Blender, Substance Painter (Standard): OpenGL (Y+).
  • Unreal Engine, Legacy Direct3D: DirectX (Y−).
  • Sieht in Unreal falsch aus? Aktiviere Flip Green Channel in den Import-Einstellungen.
  • Sieht in Unity falsch aus? Du hast wahrscheinlich aus einem DirectX-Konventions-Tool exportiert — invertiere den grünen Kanal oder exportiere neu.

Wenn du die Konvention verinnerlicht hast, ist die Lösung trivial. Der schwierigste Teil ist, sie das erste Mal zu erkennen.

#normal-map#3d#pbr#shaders#opengl#directx

Hat dir dieser Artikel gefallen?

ShareHN