OpenGL.Hu – VII. Rész

 

Textúrázás – 2. felvonás!

            Nos, a legutóbbi részben megtanultuk, hogyan adjunk szép mintázatot a definiált primitive-ekre a textúrák felhasználásával. Ez szép és, jó, de a textúrákkal még egy csomó érdekességet el lehet követni, amelyek közül néhány csupán kellemes, néhány hasznos is, néhány pedig elengedhetetlen. Ezek közül a hangzatos nevű technikák közül erre az alkalomra kettőt választottam: a texture blending és a mip-mapping.

 

Texture blending

 

Az okosabbak már kitalálhatták miről szólhat ez a rész, ha visszaemlékeztek, mi volt a blending nevű technikánk és mit értünk el vele. A lényeg tehát: textúrázott felüleletet is tudunk áttetszővé varázsolni! Olyasmire gondolok itt, mint egy katedrális mozaiküvege, vagy maszatos, kormos, összekarcolt, esetleg repedezett üveg. Jónéhány játékban találkozott már vele mindenki szerintem. Elég szép effektek állíthatók elő vele és a megvalósítása szinte alig kerül plusz kódunkba.

Mivel még nem kezeltünk alfa-csatornás (TGA, lásd majd később) textúrákat, így nem tudjuk úgy szabályozni az átlátszóságot, ahogy azt a szineknél tettük.

Egyenlőre beérjük ennyivel.

 

 

 

 

 

Tehát lépésenként a teendőink:

1)      A depth testing kikapcsolása. A depth testing lényege ugye, hogy eldőljön, két primitív közül, melyik van közelebb a nézőponthoz. A távolabbit – részben legalábbis – nem jelenítjük meg, ha a közelebbi takarja. Mivel itt minden primitive-nek láthatónak kell lennie, ezért ez a tesztelés felesleges és kellemetlen hatásokat hozhat. (Ki lehet próbálni, milyen ha bekapcsolva marad a depth testing. Őszintén, minden csak nem szép!) Tehát, cseréljük ki a

glEnable(GL_DEPTH_TEST);

sort a következőre:

glDisable(GL_DEPTH_TEST);

2)      A blendelés bekapcsolása. Senki meg ne kérdezze, miért! J Ezt ugyanúgy tesszük, mint ahogy a korábbi cikkben bemutatásra került. Keressük meg a következő sort:

glEnable(GL_TEXTURE_2D);

Szúrjuk be utána ezt:

      glEnable(GL_BLEND);

      glBlendFunc(GL_SRC_ALPHA,GL_ONE);

És ennyi! Felvétel vége! J A végeredmény fent látható!

 

Mip-mapping

 

            Felmerül a nagy kérdés, mi is ennek a mulatságos nevű technikának a lényege? Elmagyarázom egy példán keresztül! Képzeljük el, hogy csinálunk QUAD-okból egy 100x50 egység (egy egység = egy QUAD) méretű négyzetrácsot, majd mindegyik QUAD-nak megadjuk ugyanazt a textúrát. Legyen mondjuk ez egy football-pálya, amely ugye meglehetősen nagy. Az egyik sarkában álldogáló játékos biztosan nem fogja látni külön-külön az összes fűszálat. Feleslegesek tehát a nagyfelbontású, részletes textúrák, hiszen csak nagyjából látszódnak és csak a render-t lassítják a méretük miatt. De igen ám, viszont így a  hozzánk közel lévő részeken ekkor elnagyolt és „elmaszatolt” lesz a textúra. Mi lenne a megoldás? Az, ha a távolság arányában többféle részletességi szintű textúrát alkalmaznánk. Ez a mip-mapping lényege. Hogy ezzel ne a programozónak kelljen az értékes idejét elvesztegetni, az OpenGL már tartalmaz egy megoldást ennek a megvalósítására.

A lényege, hogy mikor a betöltött bitképből a textúrát generáljuk, az OpenGL elkészít belőle több változatot is, különféle részletességi szinttel és ezek közül fog válogatni a távolság függvényében.

            Most újra előkerül a textúrafilterezés témája, amit ezúttal már nem kerülhetünk meg. A textúrafilterezés lényege többek között, hogy megadhatjuk, kicsinyítésnél (távol van) és nagyításnál (közel került) hogyan viselkedjenek a textúrák. Az OpenGL glTexParameteri() ill. glTexParameterf() függvényeivel tudunk textúrázási paramétereket beállítani, melyek közé a textúrafilterezés is tartozik. A

http://www.opengl.org/developers/documentation/man_pages/hardcopy/GL/html/gl/texparameter.html címen olvashatunk a fenti két utasítás szintaxisáról és a velük beállítható paraméterekről. Számunkra most igazán csak a GL_TEXTURE_MIN_FILTER és a GL_TEXTURE_MIN_FILTER paraméter a fontos. Az előbbi a textúra kicsinyítéséért, a másik a nagyításáért felel. Mindkettővel találkoztunk már az előző két példában (7., 8.) és most annyiban fog változni a használatuk, hogy a GL_TEXTURE_MIN_FILTER paramétert a GL_LINEAR helyett a GL_NEAREST_MIPMAP_LINEAR értékre fogjuk beállítani.

Összesen hatféle textúrafilterezés van, amit választhatunk, ezek közül a GL_NEAREST a legrosszabb minőségű, de a leggyorsabb, míg a GL_LINEAR a legjobb minőségű. A mip-mapping igyekszik valahol egyensúlyt találni a kettő között. Ennek is négy változata van, GL_xx_MIPMAP_xx alakban, ahol xx vagy LINEAR vagy NEAREST. A fentiek alapján ki lehet találni, melyikkel járunk a legjobban.

Egy másik fontos módosítás: a glTexImage2D() helyett most  a gluBuild2DMipmaps()

függvénnyel fogjuk felépíteni a textúrát. A két utasítás szintaxisa nagyon hasonló, így nem részletezem. Példaként az előző példát használtam ezekkel a minimális átalakításokkal.

 

            Ennyit terveztem erre az alkalomra. A következőre még mindig a textúrázás marad, mert nagyon sok minden van, ami kipróbálásra, bemutatásra vár. Várom kérdéseiteket, kommentárjaitokat e-mailben illetve a fórumokon is. Jó munkát/szórakozást kívánok az OpenGL-lel!

 

Merczel László - laszlo.merczel@mailbox.hu