OpenGL.hu |
OpenGL – biztosan hallotta már mindenki ezt a szót, így vagy úgy. A tapasztaltabbak már tudhatják, hogy ennek valamilyen módon köze van a napjainkban mindennapossá vált 3D videovezérlőkhöz, a háromdimenziós játékcsodákhoz és úgy általában a számítógépes grafikához. Mivel Magyarországon kevés lehetőség adott arra, hogy valaki az anyanyelvén tudjon meg többet erről a témáról, úgy gondoltam, itt az ideje, hogy valaki megpróbáljon minél többet elmondani, minél érthetőbben, úgy hogy azok is megértsék, akik nem vérbeli programozók. Gondolok itt olyanokra is, akik rengeteg időt töltöttek el egy-egy játék mellett, amiről aztán valamelyik ismerősüktől olyasmit hallottak, hogy "ez OpenGL-es". Biztosan gondolt már mindenki arra, miközben egy játékkal játszott, hogy ez a pálya nézhetett volna ki másképp is, vagy az ellenség lehetett volna élethűbb is, esetleg itt vagy ott néhány dolgot másképp csinált volna a játék készítői helyében. Ettől pedig már nincs messze az a gondolat, hogy kellő kitartással, fantáziával bárki írhat játékot, persze miután a megfelelő ismeretek birtokába jutott. Ez utóbbiban szeretnék ezzel a cikkel segíteni. Az elszánt, de egyenlőre még csak tapogatódzó, leendő játékkészítők kezébe adni egy hatalmas támaszt - az OpenGL grafikai rendszert. A cikksorozat három kérdés köré fog csoportosulni: "Mit?", "Mivel?" és végül "Hogyan?". Az első természetesen azt takarja, hogy mit fogunk csinálni, mit fogok elmagyarázni. A második kérdés arra utal, hogy milyen eszközökkel fogunk dolgozni, mire lesz szüksége annak, aki ebbe szeretne belevágni. És végül a harmadik és egyben leghosszabb, több cikkre kiterjedő rész konkrét technikákat, algoritmusokat és trükköket fog ismertetni, amelyeknek később bárki hasznát veheti, aki úgy dönt, hogy OpenGL programozásra adja a fejét. |
Mit? |
Mielőtt bármi gyakorlati dolgot csinálnánk, úgy gondolom, illő lenne, ha szólnék pár szót az OpenGL rendszerről, majd ismertetnék néhány alapfogalmat, melyekre azonnal szükség lesz, ha elkezdünk kicsit mélyebb vizekre evezni. Az OpenGL programozói szemmel nem más, mint egy rutinkönyvtár (API), amely körülbelül 200 parancsot tartalmaz azzal a céllal, hogy a fejlesztők munkáját segítse, ha háromdimenziós grafikával akarnak dolgozni. Másrészről viszont egy operációs rendszertől és fordítóprogramtól független interface a felhasználói programok és a hardver között. Fejlesztői - a Silicon Graphics mérnökei - gondosan ügyeltek arra, hogy a dolgunkat a lehető legegyszerűbbé tegyék, ugyanis lényegében, amikor az OpenGL segítségével egy 3D alkalmazást írunk, egy virtuális háromdimenziós koordináta-rendszerben dolgozunk. Ahogy a Descartes-féle koordináta-rendszerben nincsenek méretek, csupán az "egység", ugyanúgy az OpenGL-nél is egységben számolunk mindent. Itt mindjárt be is vezetném az első és egyben legfontosabb alapfogalmat, a vertex fogalmát: vertex (csúcs) alatt egy olyan pontot értünk, amelyet a fent említett virtuális koordináta rendszerből az adott (x,y,z) koordináta-hármassal jelölünk ki. Ahogy anno középiskolában oktatták az alapvető geometriai definíciókat, úgy itt is elmondhatjuk, hogy két vertex már egyértelműen meghatároz egy egyenest (line) stb. És mindjárt meg is mutatja magát az OpenGL első igazi szépsége: a rendszer a háromdimenziós számítások oroszlánrészét elvégzi helyettünk! Régebben, ha valaki térbeli dolgokat akart egy programban ábrázolni, magának kellett megírni azokat a rutinokat, amelyek a szükséges számításokkal elérték, hogy a virtuálisan 3D-ben megadott pontok, egyenesek, olyanná váljanak, hogy az amúgy csak két dimenzióban "gondolkodó" videovezérlő meg tudja őket jeleníteni. Léteztek persze rutinkönyvtárak akkor is, de ez a szoftveres megoldás nem nyújtott kielégítő teljesítményt. Ezzel szemben az OpenGL hardverközeli megvalósításainak hála a 3D számításokra felkészített videovezérlő nem csupán könnyebbé, de nagyságrendekkel egyszerűbbé teszi a munkánkat. Ennek persze ára is van: nem minden videovezérlő OpenGL-kompatibilis, sőt a frissen kifejlesztett bővítéseket tartalmazó 1.3-as OpenGL API-t már csak a legújabb videokártyák támogatják. Még megemlíteném azt, hogy az OpenGL néhány speciális mátrix-szal dolgozik, melyek segítségével például a fent említett koordináta-transzformációkat végzi el. Ezen mátrixok a projekciós (projection), illetve a modellnézeti (modelview) mátrixok. A dolog működése és matematikája elég bonyolult, így ezt csak később szándékozom részletezni, de a lényeg röviden a következő: a modellünk 3D koordinátáin először a modelview mátrix-szal végez a rendszer szorzást, hogy a vertexek koordinátáiból megkapja az ún. nézőpont koordinátákat (eye coordinates). Ezeket befolyásolja például a látótér szögének állítása, amire később majd konkrét példát is nézünk. A nézőpont-koordinátákon ezután a projekciós mátrix-szal való szorzás kerül végrehajtásra, mely már a kétdimenziós (levetített, innen a mátrix elnevezése) koordinátákat adja meg. Azt már tudjuk, hogy azzal nem kell foglalkoznunk, hogy hogyan jeleníti meg a videokártya azt, amit mi virtuálisan megadunk, csupán azzal, hogy hogyan adjuk meg. Az OpenGL-ben minden objektum (pl. egy játékos modellje), legyen az bármilyen bonyolult is, a legegyszerűbb geometriai elemekből (primitives) épül fel. Egy primitive lehet pl. egy háromszög (triangle), amit három vertex-szel egyértelműen meg tudunk adni, vagy egy négyszög (quad), amit négy vertex jelöl ki. Létezik ezenkívül a szakasz (line), illetve a sokszög (polygon), amelyeket szintén a matematikai definíciójuknak megfelelően, vertex-ekkel adunk meg a virtuális térben. Ezekből a primitive-ekből épül azután fel minden, és a későbbiekben meglátjuk, hogy egy halom műveletet el tudunk végezni velük, megvalósítva a legvadabb elképzeléseinket is. |
Mivel? |
Amikor elkezdtem OpenGL-t programozni, az első dolgom természetesen az volt, hogy körülnéztem az Interneten, hogy mivel és hogyan kellene elindulnom. Őszintén szólva elég siralmas következtetésre jutottam: az OpenGL programozást általában mindenki C++-ban csinálja, ami nem baj, sőt! De sajnos a cikkek és leírások 90%-a úgy kezdődik, hogy indítsd el a Microsoft Visual Studio 6.0-t! Ugye mindenkinek megvan otthon? Mi van, ha csak egy egyszerű egyetemista/középiskolás az, aki meg akarja tanulni az OpenGL-t? Csak emiatt maradjon ki belőle? - Ott a Linux! - mondjátok biztosan sokan! Nos hát, mivel a cikket a játék-programozás és a 3D grafikus motorok írása irányába szeretném terelni, úgy gondolom, erre mégsem a Linux lenne a legmegfelelőbb platform! (Azonban az OpenGL platformfüggetlen volta miatt kis módosításokkal a pingvinbarátok is felhasználhatnak majdnem mindent, amit a cikksorozatban leírni tervezek.) Bármilyen hihetetlen, a Windows alá is léteznek GNU fordítók, melyek tökéletesen elvégzik azt a munkát, amibe mi most itt bele akarunk vágni. Itt megemlíteném a BloodShed Inc. (http://www.bloodshed.net) DevC++ névre hallgató programját, amely egy IDE a GC++ köré és - ha nem használunk MFC-t, márpedig mi ebben a cikksorozatban nem fogunk - tökéletesen kiváltja a Visual C++-t, valamint nonprofit használatra teljesen ingyenes! Ezzel persze senkinek sem fogom azt mondani, hogy márpedig használja a fenti fordítót, csak egy támpontot szeretnék nyújtani, hogy hogyan lehet anyagi ráfordítás nélkül - mindössze egy Windows birtokában az OpenGL programozásának nekikezdeni. Eddig eljutottunk odáig, hogy ismerik már az OpenGL alapfogalmait, valamint azt, hogy milyen környezetben fogunk a továbbiakban dolgozni. A következő cikkben már részletezni fogjuk első példaprogramunkat is! Zárásként ismertetnék néhány követelményt, amelynek a folytatáshoz mindenkinek meg kell felelnie: rendelkezzni egy OpenGL-kompatibilis videokártyával, valamilyen C++ fordítóval (megpróbálom elérni, hogy legalább egy GNU fordító felkerüljön a CD-re, hogy ez ne okozzon nehézséget senkinek), némi C/C++ tapasztalattal (elég a nyelv szintaktikájának és az alap foglalt szavaknak az ismerete is!) és rengeteg türelemmel, kitartással! Várom kérdéseiket, kommentárjaikat e-mailben! Viszlát következő alkalommal! |
Merczel
László |