A Mesh és a MeshFilter komponens
A Mesh vagy poligon mesh egy 3D-s alak, amit háromszögek hálója reprezentál.
A számítógépes képalkotási világ nagy részében és a teljes videójátékfejlesztésben mesh-ekkel jelenítünk meg 3D alakokat.
A mesh alkotó elemei:
- Vertex: Kiterjedés nélküli 3D pozíció a térben
- Edge: Két Vertex-et összekötő él
- Face: Három élből álló háromszög
A Unity nem modellező szoftver, önmagában nem lehet vele szerkeszteni 3D mesh-eket, de több általános file formátumot is támogat, ami képes mesh információt tartalmazni. Ezek a következő kiterjesztések:
- .fbx
- .dae
- .3ds
- .dxf
- .obj
- .skp
Emellett 3D-s szerkesztőkprogramok projektfájljai is használhatók Unity-vel. Ebben az esetben nincs szükség a file-ok exportálására általános formátumra, de szükséges az adott szoftver telepítése a Unity-t is futtató munkagépre:
- Maya
- Modo
- Cinema 4D
- Lightwave
- 3ds Max
- Blender
- Cheetah3D
Mind az általános 3D-s formátumok, mind pedig a projektfájlok tartalmazhatnak a mesh-eken kívül egyéb adatokat is.
Ahhoz, hogy egy Mesh-t, azaz 3D-s formát tudjunk hozzárendelni egy GameObject-hez szükségünk van egy MeshFilter komponensre. Ezt aztán a MeshRenderer és a MeshCollider tudja felhasználni (Lásd később.)
A Unity alapból tartalmaz pár olyan egyszerű mesh-t a minden projektekben, mint a kocka és a gömb.
MeshRenderer
Ha valamitől azt várjuk el, hogy látható legyen a kamera számára szükségünk van egy Renderer komponensre. A MeshRenderer, egy Mesh-t jelenít meg a térben.
A megjelenítendő mesh nem a MeshRenderer beállítása, azt a vele egy GameObject-en lévő MeshFilter-nek kell tartalmaznia. MeshRenderer ezért nem használható MeshFilter nélkül.
A MeshRenderer legfontosabb beállítási lehetősége a Material. A mesh csak az objektum alakját írja le, azt, hogy a felülete hogy nézzen kis és hogy interaktáljon a virtuális fénnyel a Material tartalmazza.
Shader és Material
Egy material egy file, ami meghatározza hogyan mézzen ki a 3D objektum felülete és hogy pontosan hogyan verje vissza a fényt.
A játékok objektumainak renderelésének módját egy apró, a videokártyán futó szoftver, a shader program írja le. Egy adott objektumon használt shader határozza meg, hogy az adott mesh-t hogyan jeleníti meg a renderer. Mennyire tükröződjön a felület? Mennyire erősen érvényesüljön az árnyék és milyen színnel? Ilyen és ehhez hasonló kérdésekre a shader ad választ.
Egy játékban egymás mellett különböző shader programokkal rendelkező objektumok létezhetnek.
Egy shader-nek vannak beállításai, mint például a felület színe, a fémes csillogás mértéke vagy akár egy vagy több textúra.
A material gyakorlatilag egy shader program és annak egy adott beállításának összessége.
Bővebben arról, hogy a fény hogyan lép interakcióba egy Material-lal: Fények és Skybox
A Textura és UV koordiunáták
A textúra egy olyan kép, aminek a célja, hogy rávetítsék egy mesh-re. Ezt legegyszerűbben úgy tudjuk elképzelni, mint ahogy a mikuláscsoki 2D papírja rávetül a 3D csokoládé télapóra. Egy mesh minden vertexéhez (pontjához) társítani tudjuk egy textúra valamely 2D koordinátáját.
UV koordináták: Ezt a kapcsolást vertex és 2D textúrakoordináta közt UV mapnak nevezik. A mesh minden egyes vertex-éhez tehát tartozik egy UV koordináta is. Az U és V betűk a textúra vízszintes és függőleges koordinátájára utalnak.
(Azért nem X és Y, mert azok a Z koordinátával együtt a pont térbeli helyét fejezik ki. Azáltal, hogy a textúrán beüli tengelyeket U és V betűkkel jelöljük, nincs keveredés a textúra 2D kooridinátái és a vertex 3D térbeli koordinátái közt.)
Az U és V koordináták jellemzően 0 és 1 közti értéket vesznek fel. Ez a kép szélső értékeit jelenti, vagyis a 2D kép bal és jobb oldalát a vízszintes U tengelyen valamint a kép alját és tetejét a függőleges V tengelyen.
(Speciális használat esetén egyéb érték is megadhatók textúrakoordinátaként. Ekkor a textúra asset Inspector felületén a Wrap Mode beállításnál lehet dönteni arról, hogy milyen logika alapján történjen a kirajzolás: Ismétlődés, tükröződés…)
Textúrák különböző felhasználása
Egy material több megjelenítéshez hasznos textúrát is tartalmazhat. Ezen textúrák mindegyikét az uv koordináták kötik a mesh bizonyos vertexeihez. Viszont a különböző textúrák nem csak a felület színét, de számos egyéb információt tartalmazhatnak, arról, hogy hogyan jelenjen meg a mesh felszínének egy pontja. Különböző shader-ek különböző textúra típusokat várnak beállításul, amiket különböző módon használhatnak fel. Példák:
Color/Albedo Map: A felület színét (albedo-ját) adja meg.
Normal map: (Egy felület normálvektora a felületre teljesen merőleges, felfelé mutató irány)
A normal map azt írja le, milyen irányban módosuljon a felület szöge fényvisszaverés szempontjából a valódi 3D normálvektorhoz képest.
Height/Displacement Map: A felület mennyire legyen eltolva a normálvektor irányába az eredeti 3D pozícióhoz képest.
Occlusion Map: Mennyire erősen érvényesüljenek indirekt fények egy felületen.
Emission map: A felület mennyire sugározzon fényt akkor is, ha az nem esik rá külső forrásból.
Ezekből összeállított materiál igen gazdag megjelenítést tesz lehetővé. Egy shader írásakor annak készítője dönt arról hogy hány textúrát
PBR Material-ok
A Physically Based Rendering (röviden PBR), azaz fizika alapú renderelés olyan matematikai modelleket takar, ami valósághű árnyalást eredményez. Ezen modellek leimplementálhatók programkóddal és PBR shaderek készíthetők belőle, majd ezekkel a shaderekkel PBR materialokat készíthetünk.
Emlékezzünk: egy material gyakorlatilag egy shader és annak egy adott beállításainak összessége.
Két fontos PBR modell létezik és mindkettőhöz tartozik egy beépített Unity shader.
- Metallic/Roughness modell - Unity Standard shader
- Specular/Smoothness modell - Unity Standard (specular) shdader
Ezen matematikai modellek részleteivel is szoftveres implementációjával itt nem foglalkozunk, helyett tekintsük át a Unity Standard materiálját, ami a Metallic/Roughness modell egy verzióját valósítja meg.
A Unity Standard Shader
A Unity Standard material a leggyakrabban használt 3D shader a motorban, ezért egy új material asset létrehozásakor alapértelmezetten ezt a shadert választja ki a Unity.
Egyéb shaderprogramok közül a Shader nevű legördülő menüben lehet válogatni a material beállításai közt.
A Metallic/Roughness modell szerinti PBR materiálon beállítható egy felület diffúz, spekuláris és ambiens fényelése valamint egy egyéb “metallicness” érték is, ami azt szabályozza mennyire hasson egy felület fém szerűnek.
(Megemlítendő, hogy annak ellenére, hogy a Unity Standard Shader a Metallic/Roughness modell-t valósítja meg, a különböző változók nevei nem feltétlenül egyeznek meg a többé-kevésbé bevett terminológiával. Ennek fő oka, hogy ez a bizonyos nevezéktan nem túl kiforrott még manapság sem.)
Albedo: Azt mondja meg, hogy mely színtartományban veri vissza a fényt a felület és milyen erősséggel. Erre kicsitpongyolán gondolhatunk egyszerűen úgy, mint az anyag színére.
Metallic: A beállítás azt szabályozza, hogy mennyire “fémes” egy felület. Ez a fémesség hatással van a diffúz és a spekuláris visszaverésre is.
Smoothness: Azt, adja meg, hogy a felületen történő fényvisszaverés milyen mértékben diffúz és milyen mértékben spekuláris.
Emission: A felület környezettől független ambiens színét adja meg.
A fentiek mindegyike lehet egy egyszerű konstans szín vagy szám érték, de egy objetumon belül változhatnak is egy texúra szerint.
(Standard Shader esetén a smoothenss-re nincs külön textúrabeállítás lehetőség, ezt az Albedo vagy Metallic map alfa csatornájába kell beleégetni. Hát, igen, ez elég kényelmetlen és pusztán technikai optimalizációs oka van.)
PBR material-ok is rendelkezhetnek olyan a korábban megismert textúra beállításokkal, mint például, normál és occlusion map.
Mip mapok
Amikor egy textúra egy távoli felületen jelenik meg, akkor az adott kép sokkal kisebb méretben látszik, mint az eredeti felbontása. Ez gyakran ahhoz vezet, hogy nagyon zavarosnak látszódik a távoli textúra. Ennek az az oka, hogy a renderelés minden pixelhez meg próbálja megállapítani a hozzá tartozó textúra pozíciót. Ha egy képernyő pixel felülete nagyobb területet fed le a textúrán, akkor is csak egy textúra pixelt fog vissza adni a renderer, és kellően távoli elemek esetén két egymás melletti képernyőpixelhez a textúrán nagyon távoli pixel is tartozhat. Ezt az alábbi ábra mutatja be.
A fenti probléma megoldására az úgynevezett mip map-ok technikáját szoktuk használni. A mip map gyakorlatilag egy textúra kisebb verzióinak eltárolása. Minél távolabb van egy tárgy a kamerától, a textúra annál kisebb verziójáról mintavételez a renderer. Mivel ezen kicsinyített verziók alacsonyabb felbontásúak, a megjelenített képrészlet homályosabb lesz: Ez átlagolása egy nagyobb felület pixeleinek. Ebben az esetben pont ez az, amit el szeretnénk érni.
A technika nagyban tudja javítani a vizuális minőséget különösebb extra számítási kapacítás szüksége nélkül. Ennek oka, hogy ezen kisebb textúra verziókat, azaz a mip mapot a fejlesztés ideje alatt készítette el a Unity automatikusan, nem pedig futás közben.
Azt, hogy egy textúrából készüljön-e mipmap be tudjuk állítani annak Inspector felületén: Generate Mip maps
Emellett a Filter Mode beállítás is a mip mapokhoz kötődik:
- Point: Nem használja a mip mapot (Legkevesebb számítás)
- Bilinear: Igen éles mip map szint határokkal
- Trilinear: A szintek határait is egymásba mossa. (Legtöbb számítás)
Az Aniso Level textúrabeállítás határozza meg, milyen távolságban váltakozzanak a mipmap szintek.
2D és 3D grafika keverése.
Most hogy áttekintettük a 2D és a 3D grafika alapjait meg kell említeni, hogy a két kirajzolási mód minden probléma nélkül vegyíthető egymással. Erre példák lehetnek a következő játékok: