Terug naar Blog
Tutorials

Normal Map Conventies: OpenGL vs DirectX Uitgelegd

Waarom je normal map geïnverteerd lijkt in Unreal maar prima werkt in Unity — een duidelijke uitleg van tangent-space Y-as conventies, met concrete oplossingen.

Admin23 april 20263 min leestijd11

Je plug een normal map in Unreal en het oppervlak wordt verlicht alsof de zon van beneden komt. Je plug hetzelfde bestand in Unity of Blender — ziet er geweldig uit. Het mesh is identiek. De textuur is identiek. Wat is hier aan de hand?

Twee Industrieën, Eén Axis van Onenigheid

Normal maps slaan een oppervlakterichting op in hun RGB-kanalen. Rood = X, groen = Y, blauw = Z. Elke PBR-engine decodeert ze op dezelfde manier met één uitzondering: het teken van Y.

OpenGL-conventie (Y+): een helderder groen kanaal betekent dat het oppervlak omhoog wijst. Gebruikt door Unity, Godot, Blender (Cycles en Eevee), Substance Painter's standaard export, en elke WebGL-gebaseerde engine.

DirectX-conventie (Y−): helderder groen betekent dat het oppervlak omlaag wijst. Gebruikt door Unreal Engine, de legacy Direct3D-toolchain, en enkele CryEngine/Xbox-era assets.

Dezelfde bytes in de PNG. Tegengestelde fysieke betekenis.

Hoe je het in Één Oogopslag Ziet

Kijk naar een bolvormige bump (zoals een knop of een koepel) in je normal map. In OpenGL-conventie is de onderkant van de bump donkerder groen omdat het oppervlak naar Y− roteert, weg van het licht. In DirectX-conventie is de onderkant helderder groen.

Als je verlichting in-engine andersom aanvoelt — highlights waar schaduwen horen te zijn — heb je een conventie-mismatch.

De Oplossing Duurt 5 Seconden

In Unreal heeft de texture import-dialoog een Flip Green Channel-checkbox. Zet deze aan en de engine inverteert het G-kanaal bij sampling. Je hoeft niet opnieuw te exporteren uit je bron.

In Unity, stel het textuurtype in op Normal map en de importer regelt alles — Unity verwacht OpenGL, maar waarschuwt je als het bestand er verkeerd uitziet. In Blender, gebruik je een Separate Color → Invert G → Combine Color-node-keten, of kies DirectX-stijlinvoer direct in de Normal Map-node.

Waarom Twee Standaarden Überhaupt?

In de jaren 90 definieerden OpenGL en DirectX tegengestelde texture-coördinaatruimtes — OpenGL had Y toenemend omhoog, DirectX had Y toenemend omlaag. Toen normal maps gangbaar werden in het midden van de jaren 2000, bakte elke toolchain zijn ruimte in zijn outputs. De divergentie bleef hangen omdat een bestaande pipeline flippen duur is.

Normal Maps Genereren Zonder Verwarring

De aukimi Normal Map Generator laat je de conventie expliciet kiezen wanneer je exporteert. Het voert een Sobel-gradiënt uit op de luminantie van je heightmap, en pak vervolgens (−dx·s, −dy·s, 1) in RGB — met Y geflipped wanneer je DirectX kiest. Je kunt de conventie na generatie omschakelen en opnieuw downloaden zonder opnieuw te uploaden.

Inwendig is de formule identiek. Het enige verschil is het teken dat we toepassen op het Y-component voordat we het groene kanaal schrijven. Met die kennis kun je een bestand tussen conventies omzetten met elke afbeeldingseditor: open de PNG, selecteer het groene kanaal, inverteer het, bewaar het. Dat is alles wat "Flip Green Channel" in Unreal doet.

Snelle Referentie

  • Unity, Godot, Blender, Substance Painter (standaard): OpenGL (Y+).
  • Unreal Engine, legacy Direct3D: DirectX (Y−).
  • Ziet er verkeerd uit in Unreal? Zet Flip Green Channel aan in de import-instellingen.
  • Ziet er verkeerd uit in Unity? Je hebt waarschijnlijk geëxporteerd uit een DirectX-conventie-tool — inverteer het groene kanaal of exporteer opnieuw.

Zodra je de conventie hebt begrepen, is de oplossing triviaal. Het moeilijkste deel is het de eerste keer herkennen.

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

Heeft dit artikel je geholpen?

ShareHN