Zpět na Blog
Tutoriály

Konvence Normal Map: OpenGL vs DirectX vysvětleno

Proč vaše normal mapa vypadá převrácená v Unrealu, ale v Unity vypadá skvěle — jasné vysvětlení konvencí Y osy v tangent-space s konkrétními řešeními.

Admin23. dubna 20263 min čtení11

Vložíte normal mapu do Unrealu a povrch se osvětluje, jako by sluníčko vycházelo zespodu. Stejný soubor vložíte do Unity nebo Blenderu — vypadá skvěle. Mesh je totožný. Textura je totožná. Co se děje?

Dvě průmysly, jedna osa neshody

Normal mapy ukládají směr povrchu do svých RGB kanálů. Red = X, zelená = Y, modrá = Z. Každý PBR engine je dekóduje stejným způsobem s jednou výjimkou: znaménkem Y.

Konvence OpenGL (Y+): jasnější zelený kanál znamená, že povrch směřuje nahoru. Používáno Unity, Godot, Blender (Cycles a Eevee), výchozí export Substance Painter a všechny WebGL-based enginy.

Konvence DirectX (Y−): jasnější zelená znamená, že povrch směřuje dolů. Používáno Unreal Engine, starší Direct3D toolchain a některé assety z éry CryEngine/Xbox.

Stejné bajty v PNG. Opačný fyzikální smysl.

Jak to poznat na první pohled

Podívejte se na hemisférické vyboulení (jako tlačítko nebo kupole) ve vaší normal mapě. V konvenci OpenGL bude spodek vyboulení tmavší zelený, protože se povrch otáčí směrem k Y−, pryč od světla. V konvenci DirectX je spodek jasnější zelený.

Pokud vám osvětlení v enginu působí obráceně — světla tam, kde by měly být stíny — máte neshodu konvencí.

Oprava trvá 5 sekund

V Unrealu má dialog importu textury zaškrtávací políčko Flip Green Channel. Zapněte jej a engine invertuje G kanál v okamžiku vzorkování. Není potřeba znovu exportovat zdroj.

V Unity nastavte typ textury na Normal map a importer se o vše postará — Unity očekává OpenGL, ale varuje vás, pokud soubor vypadá špatně. V Blenderu použijte řetězec uzlů Separate Color → Invert G → Combine Color, nebo vyberte přímo DirectX-style vstup v uzlu Normal Map.

Proč dva standardy na prvním místě?

V 90. letech definovaly OpenGL a DirectX opačné textury koordinačních prostorů — OpenGL měl Y rostoucí nahoru, DirectX měl Y rostoucí dolů. Když se normal mapy staly běžnými v polovině 2000. let, každý toolchain zavedl svůj prostor do svých výstupů. Rozdíl zůstal, protože překlápění zavedené pipeline je drahé.

Generování Normal Map bez zmatků

aukimi Normal Map Generator vám umožňuje explicitně vybrat konvenci při exportu. Spouští Sobelův gradient na svítivosti vaší heightmapy, pak zabaluje (−dx·s, −dy·s, 1) do RGB — s Y převrácené, když zvolíte DirectX. Konvenci můžete přepínat po vygenerování a znovu si stáhnout bez opětovného nahrávání.

Interně je vzorec identický. Jediný rozdíl je znaménko, které aplikujeme na Y komponentu před zápisem zeleného kanálu. Když to víte, můžete konvertovat soubor mezi konvencemi s jakýmkoli editorem obrázků: otevřete PNG, vyberte zelený kanál, invertujte jej, uložte. To je všechno, co dělá "Flip Green Channel" v Unrealu.

Rychlá reference

  • Unity, Godot, Blender, Substance Painter (výchozí): OpenGL (Y+).
  • Unreal Engine, starší Direct3D: DirectX (Y−).
  • Vypadá špatně v Unrealu? Povolte Flip Green Channel v nastavení importu.
  • Vypadá špatně v Unity? Pravděpodobně jste exportovali z DirectX-convention nástroje — invertujte zelený kanál nebo znovu exportujte.

Jakmile si internalizujete konvenci, oprava je triviální. Nejobtížnější část je ji poprvé rozpoznat.

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

Líbil se vám tento článek?

ShareHN