Takaisin Blogiin
Oppaat

Normal Map -konventiot: OpenGL vs DirectX selitetty

Miksi normaalikartastasi näyttää käänteinen Unrealissa mutta näyttää hyvältä Unityssä — selkeä selitys tangent-space Y-akselin konventioista ja konkreettiset ratkaisut.

Admin23. huhtikuuta 20263 min lukuaika11

Liität normaalikartaa Unrealiin ja pinta valaistuu ikään kuin aurinko loistaisi alapuolelta. Liität saman tiedoston Unityyn tai Blenderiin — näyttää hyvältä. Mesh on identtinen. Tekstuuri on identtinen. Mitä täällä tapahtuu?

Kaksi teollisuutta, yksi akseli erimielisyydessä

Normaalikartastot tallentavat pinnan suunnan RGB-kanaviihinsa. Red = X, green = Y, blue = Z. Jokainen PBR-moottori dekoodaa ne samalla tavalla yhdellä poikkeuksella: Y:n merkki.

OpenGL-konventio (Y+): kirkkaampi vihreä kanava tarkoittaa, että pinta osoittaa ylös. Käytetään Unityssa, Godotissa, Blenderissa (Cycles ja Eevee), Substance Painterissa olevan oletusvientiä ja kaikissa WebGL-pohjaisissa moottoreissa.

DirectX-konventio (Y−): kirkkaampi vihreä tarkoittaa, että pinta osoittaa alas. Käytetään Unreal Enginessa, vanhan Direct3D-työkaluketjun ja joidenkin CryEngine/Xbox-aikakauden omaisuuksien välillä.

Samat tavut PNG:ssä. Vastakkainen fyysinen merkitys.

Kuinka tunnistaa silmäyksellä

Katso puolipallonmuotoista kolhua (kuten nappia tai kupolia) normaalikartassasi. OpenGL-konventiossa kolhun pohja on tummemman vihreä koska pinta kiertää kohti Y−, poispäin valosta. DirectX-konventiossa pohja on kirkkaamman vihreä.

Jos valaistus tuntuu käänteiseltä moottorissa — korostetut kohdat missä varjot pitäisi olla — sinulla on konventioiden väärinsovitus.

Korjaus kestää 5 sekuntia

Unrealissa tekstuurin tuontidialogissa on Flip Green Channel -valintaruutu. Kytke se päälle ja moottori kääntää G-kanavan näytteenottovaiheessa. Ei tarvitse viedä lähdetiedostoa uudelleen.

Unityssa aseta tekstuurin tyyppi arvoon Normal map ja tuoja hoitaa kaiken — Unity odottaa OpenGL-konventiota, mutta se varoittaa sinua jos tiedosto näyttää väärältä. Blenderissa käytä Separate Color → Invert G → Combine Color -solmuketjua, tai valitse vain DirectX-tyyppinen syöte suoraan Normal Map -solmussa.

Miksi kaksi standardia alun perin?

1990-luvulla OpenGL ja DirectX määrittelivät vastakkaiset tekstuurikoordinaattiavaruudet — OpenGL:ssä Y kasvoi ylöspäin, DirectX:ssä Y kasvoi alaspäin. Kun normaalikartastot tulivat yleisiksi 2000-luvun puolivälissä, jokainen työkaluketju paalutti avaruutensa lähtöihinsä. Eriytyminen jäi pystyväksi koska vakiintuneen putkiston kääntäminen on kallista.

Normaalikarttojen luominen ilman sekaannusta

aukimi Normal Map Generator antaa sinulle mahdollisuuden valita konventio selkeästi kun viet. Se ajaa Sobel-gradientin korkeuskartastosi luminanssissa, sitten paketoi (−dx·s, −dy·s, 1) RGB:hen — Y:n kääntäen kun valitset DirectX:n. Voit kytkeä konvention viennin jälkeen ja ladata uudelleen ilman uudelleen latausta.

Sisäisesti kaava on identtinen. Ainoa ero on merkki jota sovellamme Y-komponenttiin ennen vihreän kanavan kirjoittamista. Tietäen sen, voit muuntaa tiedoston konventioiden välillä millä tahansa kuvaeditorilla: avaa PNG, valitse vihreä kanava, käännä se, tallenna. Se on kaikki mitä "Flip Green Channel" tekee Unrealissa.

Nopea viiteopas

  • Unity, Godot, Blender, Substance Painter (oletus): OpenGL (Y+).
  • Unreal Engine, vanhamuotoinen Direct3D: DirectX (Y−).
  • Näyttää väärältä Unrealissa? Ota käyttöön Flip Green Channel tuontiasetuksissa.
  • Näyttää väärältä Unityssa? Olet todennäköisesti vienyt DirectX-konvention työkalusta — käännä vihreä kanava tai vie uudelleen.

Kun olet sisäistänyt konvention, korjaus on triviaali. Vaikein osa on tunnistaa se ensimmäisen kerran.

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

Piditkö tästä artikkelista?

ShareHN