Vissza a bloghoz
Oktatóanyagok

Normál térkép konvenciók: OpenGL vs DirectX magyarázat

Miért fordított a normál térképed az Unreal-ben, de jó az Unity-ben — egyszerű magyarázat a tangent-space Y tengely konvenciókról, konkrét megoldásokkal.

Admin2026. április 23.3 perc olvasás11

Bedugod a normál térképet az Unreal-be és a felület úgy világít, mintha a nap alulról sütne. Ugyanezt a fájlt bedugod az Unity-be vagy a Blenderbe — remekül néz ki. A mesh azonos. A textúra azonos. Mi történik itt?

Két iparág, egy tengely ellentéte

A normál térképek RGB csatornáikban tárolják a felület irányát. Piros = X, zöld = Y, kék = Z. Minden PBR engine ugyanúgy dekódolja őket egy kivétellel: az Y előjele.

OpenGL konvenció (Y+): egy világosabb zöld csatorna azt jelenti, hogy a felület felfelé mutat. Az Unity, Godot, Blender (Cycles és Eevee), a Substance Painter alapértelmezett exportja, és minden WebGL-alapú engine használja.

DirectX konvenció (Y−): világosabb zöld azt jelenti, hogy a felület lefelé mutat. Az Unreal Engine, a korábbi Direct3D eszközlánc, és néhány CryEngine/Xbox-korszakbeli asset használja.

Ugyanazok a bájtok a PNG-ben. Ellentétes fizikai jelentés.

Megismerés első pillantásra

Nézz meg egy félgömb alakú dudort (például egy gomb vagy kupola) a normál térképeden. OpenGL konvenció szerint a dudor alja sötétebb zöld lesz, mert a felület az Y− felé forog, el a fénytől. DirectX konvenció szerint az alja világosabb zöld.

Ha az освещение visszafelé működik az engine-ben — fények ahol árnyékok kellene legyenek — konvenció eltérésed van.

A megoldás 5 másodperc

Az Unreal-ben a textúra importálási párbeszédnek van egy Flip Green Channel jelölőnégyzete. Kapcsold be és az engine invertálja a G csatornát a mintavételkor. Nem kell újra exportálnod a forrásod.

Az Unity-ben állítsd a textúra típusát Normal map-re és az importer kezeli mindent — az Unity az OpenGL-t várja, de figyelmeztet, ha a fájl rossznak tűnik. A Blenderben használj egy Separate Color → Invert G → Combine Color csomópontláncot, vagy közvetlenül válassz DirectX-stílusú bemenetet a Normal Map csomópontban.

Miért két szabvány az elején?

Az 1990-es években az OpenGL és a DirectX ellentétes textúra koordináta tereket definiáltak — az OpenGL-ben az Y felfelé nőtt, a DirectX-ben lefelé. Amikor a normál térképek a 2000-es évek közepén váltak közössé, minden eszközlánc a saját terét sütötte be az outputjaiba. Az eltérés rögzült, mert egy etablált pipeline megfordítása költséges.

Normál térképek generálása zavar nélkül

Az aukimi normál térkép generátor lehetővé teszi a konvenció explicit kiválasztását az exportkor. Sobel gradienst futtat a magasságtérképed luminanciáján, majd (−dx·s, −dy·s, 1) RGB-be csomagol — az Y megfordításával DirectX választásakor. Az Y komponens előjelét alkalmazzuk mielőtt a zöld csatornát írjuk. Az előjelét az Y komponensre alkalmazzuk mielőtt a zöld csatornát írjuk. A konvenció megfordítása után újra letöltöd anélkül, hogy újra feltöltened kellene.

Belsőleg a képlet azonos. Az egyetlen különbség az az előjel, amit az Y komponensre alkalmazunk a zöld csatorna írása előtt. Ezt tudva konvertálhatsz egy fájlt konvenciók között bármely képszerkesztővel: nyisd meg a PNG-t, válaszd ki a zöld csatornát, invertáld, mentsd. Ez az egész, amit az "Flip Green Channel" tesz az Unreal-ben.

Gyors referencia

  • Unity, Godot, Blender, Substance Painter (alapértelmezett): OpenGL (Y+).
  • Unreal Engine, korábbi Direct3D: DirectX (Y−).
  • Rossz az Unreal-ben? Kapcsold be a Flip Green Channel opciót az import beállításokban.
  • Rossz az Unity-ben? Valószínűleg DirectX-konvenció eszközből exportáltál — invertáld a zöld csatornát vagy exportálj újra.

Miután internalizálod a konvenciót, a megoldás triviális. A legnehezebb része az első felismerés.

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

Tetszett a cikk?

ShareHN