2018. június 24., vasárnap

PBR - Shader maps - Normal map

A normal mapping talán a legelterjedtebb eljárás arra az igényre, hogy 3D-ben megalkotott felületeinket életszerűbbé, realisztikusabbá tegyük. Gondoljunk arra, hogy bármilyen igényesen megrajzolt, megfestett textúra pl. egy fej- vagy arc-modellen az érdesség, a mikrotextúra nélkül gumiszerűnek, műanyagnak tűnhet.
Az alábbi képen egyben bevezetőként egy kocka lapjait tettük normal map használatával realisztikusabbá, a lapokra illesztve egy kis domborulatot az eredeti textúrának megfelelően.
A mai 3D modellező programok szinte mindegyike rendelkezik azzal a képességgel, hogy az objektumokra húzott textúrák mellett velük hasonló topológiájú olyan újabb textúrákat húzzanak rétegelve az objektumokra, amelyek a szín információk után a felületeken belüli fényvisszaverődési tulajdonságokat befolyásolják, így adva hol pl. fémes, tükrös, árnyaló vagy éppen elnyelő további tulajdonságokat a felület megjelenítéséhez. Ezeket a textúrákat shader map-oknak is mondjuk gyűjtőnéven. Egyik ilyen a normal map típus, amellyel a felületen belül érdességet, durvaságot, anyagmintát, mintázatot szimulálhatunk.

Ha már modelleztünk, könnyű belegondolni, hogy egy felület ilyen jellegű kialakítása milyen gigászi feladatot jelentene, nem beszélve arról, hogy pl. egy téglafal barázdáinak folyamatos megjelenítése egy játékban mekkora erőforrásokat kötne le, ahelyett, hogy csak egy kép adatai szerint kell a fénysugár útját újra és újra kiszámolni.
Az eljárás alapja természetesen a fénysugár felületről való visszaverődésének befolyásolásán alapul.
Célszerű rögtön a gyakorlatban kipróbálni az olvasottakat, ezért a cikkhez tartozó állományok itt elérhetők.

A shader és a renderelő eljárások nagy része a megjelenítendő képpont színét, árnyalatát az eredeti modellen lévő pontnak megfelelő felületdarab síkjának normálvektora alapján számítják ki. Ez a vektor az adott felületnek megfelelő síkra merőleges, így a pontra beérkező fénysugár visszaverődése és a nézőpontba jutásának szöge ennek megfelelően kiszámítható. A legegyszerűbb ilyen alakzat egy háromszög, amelynek három csúcsához rendelnek normálvektort és a csúcsok normál-vektorának átlaga lesz a három csúcs által meghatározott face, facet, felületdarab normálvektora. A face normálvektora adja meg, hogy a térben milyen irányba néz a felületdarab.

A normal map egy kép, amit ha ráhúzunk a felületre, elhiteti a fénysugarakat számító programmal, hogy a felület más más darabjai más más irányba néznek.


A normal mapok pixeleinek színeit az határozza meg, hogy az RGB értékeket az adott pontra hogyan határozzuk meg annak megfelelően, hogy a számhármas segítségével az adott pont normál-vektorainak iránya milyen legyen.
A színkonverzió az alábbi:
0:-1
128:0
255:1
azaz az RGB(128,128,255) egy olyan normálvektort fog meghatározni, amely (0,0,1) koordinátákkal rendelkezik, a kép domináns színe a kék lesz.
Minden színértéknek megfelelő vektornak egységnyi hosszúságúnak kell lennie. Erről a normal map generáló eszközök gondoskodnak.
Ha a kép egy adott pixele kék, akkor a felület felfelé, ha zöld, akkor a felület lefelé, ha piros, akkor a felület balra néz.

A normal mapoknak két típusa van:
  • Object Space Normal: Az objektumhoz viszonyítjuk a normálvektorok irányát
  • Tangent Space Normal: A lokális koordináta-rendszerhez igazodva adjuk meg a normálvektorok irányát.

Az utóbbit gyakrabban használják, mert nem függ a megjelenítés a fényforrás helyétől és az objektum változásával a normal map is ugyanúgy változik.

Hogyan hozzunk létre normal mapot?

Alapvetően kétféleképpen készíthetünk normal mapot:

  • A modellező programunkkal készítünk két olyan objektumot, amelyek mindegyike beilleszthető ugyanabba a topológiába, majd a bonyolultabb felbontású felületét rávetítjük az egyszerűbb felületet tartalmazó másik, egyszerűbb topológiájú objektum felületére.
  • Készítünk egy textúrának megfelelő szürkeárnyalatos képet (height map), majd valamilyen normálmap készítésére alkalmas programmal vagy modullal normal mappá alakítjuk.

Utóbbi a gyakoribb és talán egyszerűbb.
Normal map készítő beépülő elérhető a Photoshophoz (NVIDIA), a Gimp pl. alapból tartalmazza csakúgy, mint a Photoshop újabb változatai (CC sorozat). 
A textúra szürkeárnyalatos képén a sötétebb részek az "átlagfelület" alatt, a világosabb részek az "átlagfelület" felett lesznek.




Jól használható szoftverek, oldalak:
ShaderMap
Knald
Normal map online
Crazybump
PixaFlux