OpenGL.Hu – V. rész

 

Az anyag nem vész el...

            Sokak gondolták bizonyára azt a legutóbbi cikk után, hogy ki tudja mikor kerülnek majd sorra azok a bizonyos „látványos” dolgok, mint például a színek, textúrák. Többen kérték is levélben, hogy amennyiben lehetséges, inkább vegyük ezeket előrébb és hagyjuk későbbre az interaktív, ám kevésbé szemet gyönyörködtető dolgokat, mint például a beígért billenytyű- és egér-kezelő Callback-eket. Nos, a dolog vége az lett, hogy hajlottam a jó szóra, mivel az OpenGL végül is a látványról szól és felhasználói beavatkozás még sokáig nem lesz kiemelkedő fontosságú a programjainkban.

 

Tehát, első lépésként, úgy gondoltam foglalkozzunk a szinekkel, mert ez még a legegyszerűbb rész az egész látvány-témában és ráadásul már találkozhattunk egy szinkezelő utasítással az egyik korábbi cikk folyamán. Ez az utasítás a

 

glColor3f(float r,g,b);

 

mely egyszerűen annyit csinál, hogy a megadott három színkomponensből előállítja a kért színt.

Mivel ez annyira nem szokott egyértelmű lenni, beszélnék egy kicsit a színrendszerekről is. Az egyik legalapvetőbb és legsűrűbben használt színrendszer az RGB, mely nevét a három színkonponensből kapta, amelyekből felépül. Ezek:

            R         -          Red (Vörös)

            G         -          Green (Zöld)

            B         -          Blue (Kék)

A színkomponensek arányát 0-1 közötti értékek adják meg, így értelemszerűen a (0,0,0) azt jelenti, hogy egyik komponensből sem vettünk, így a „kikevert” szín a fekete lesz. Hasonlóan az (1,1,1) a fehéret jelenti, a (.5,.5,.5) pedig a kettő közötti szürkét, stb. Úgy gondolom, mindenkire rábízom, hogy nyugodtan kísérletezzen azzal, hogy az előző rész példaprogramjában a glColor3f() függvényt átírja és különböző színértékeket állít így elő.

Ha ezzel nagyjából baráti viszonyba kerültünk, továbblépünk a vertexenkénti szinezésre. A lényege nagyon egyszerű: miután korábban említettük, hogy a glBegin és a glEnd között nem csak vertexdefiníciós utasítások lehetnek, felmerül egy kérdés. Mi lenne, ha minden glVertex3f() előtt megadnánk egy glColor3f-et? Igen! Az! J

Mindegyik vertex más színű lesz, s ráadásul egy igen látványos szivárvány-effektet produkál háromszögünk. Úgy gondoltam kód helyett itt inkább látványosabb egy kép (de természetesem a kód ismét megtalálható mellékelve a cikkhez!)


 

            Az említett három színcsatornánk kívül van még egy, amellyel az átlátszóságot tudjuk befolyásolni, ez az alpha channel. A használandó utasítás ilyenkor a glColor4f(), melynél a 4., új paraméter szintén egy 0-1 közötti float, amely az alpha értéket jelenti. Az 1.0f érték azt jelenti, hogy az adott poligon teljesen átlátszatlan, míg az ennél kisebb értékek az átlátszóság fokozatait jelentik. Ahhoz, hogy átlátszóságot használhassunk, a következő két utasítást kell az inicializáló kódba tenni (Nincs kikötve, hogy hová, lehet szabadon próbálkozni itt is. Én kicsit nyers módon a főprogramba tettem közvetlen a GLUT inicializálása után.):

 

glEnable(GL_BLEND);

            glBlendFunc(GL_SRC_ALPHA,GL_ONE);

 

Ez a két utasítás gondoskodik arról, hogy bekapcsolja a blending algoritmust az OpenGL-ben. A blending kezel minden átlátszósággal kapcsolatost számítást, enélkül csupán két tömör poligon lenne a képernyőn. A második utasítás pontosan azt jelöli ki, hogy a forrás (amit blendelünk – átlátszóvá teszünk) alpha csatornáját használja annak eldöntésére, hol mennyire átlátszó a poligon. Amennyiben valakit az átlátszóság matematikája érdekel, hasznos és viszonyleg rövid bevezetőt talál a http://nehe.gamedev.net web-oldalon. (Angol nyelvű!)

A mellékelt Pelda06 nevű program egy ilyen alpha blending alapú átlátszóságot demonstrál.

 

A cikk elején említettem még egy témát a színeken kívül, a textúrázást (texture mapping). Úgy gondoltam, itt leírom az elméletét, a következő számban pedig szétboncolunk egy olyan programot, amely már erre a technólógiára épül. A legegyszerűbb a textúrázás folyamatát úgy elképzelni, hogy egy négyszög alakú poligonra felfeszítünk egy bitképet. Ehhez a felfeszítéshez elengedhetetlenül fontos az, hogy legalább azt meg tudjuk mondani az OpenGL-nek, hogy a szintén négyzetes bitkép melyik részét hova feszítse fel. Ezeket az úgynevezett textúra-koordináták írják le. Elsőre elég egyszerűnek tűnik, főleg ha egy négyzetes textúrára és egy szintén négyzet alakú poligonra gondolunk. De mi van, ha egyetlen fájlból szeretnénk betextúrázni egy ikozaédert? Itt már megjelenik az, hogy igenis ki kell jelölnünk a testen és a ráfeszítendő textúrán az összetartozó pontokat. Ezen kívül a helyzetet bonyolítja az is, hogy a textúrákat különféle formátumú képfájlokból tölthetjük be, s ezeknél különféle dolgokra kell odafigyelni. Ennek ellenére a textúrázás megéri a fáradtságot, mert enélkül egy virtuális világ sivár és egyhangú. Képzeljük csak el kedvenc 3D játékainkat kopasz, szürke falakkal! Na ugye.... J

            Ez az utóbbi rész inkább csak egy kis kitekintő akart lenni a a következő, már jóval nagyobb lélegzetvételű és igen fontos témára. Ismét csak abban reménykedem, hogy mindent sikerült érthetően, de azért nem túl szájbarágósan elmagyarázni. A felvetődő kérdésekre most is szivesen válaszolok!

Merczel László mail: laszlo.merczel@mailbox.hu