Bevezetés az OpenGL programozásába.


Mi az az OpenGL?

Az OpenGL egy szoftver-interfész, amelyet a grafikus hardverekhez készítettek. Ez az interfész kb. 120 különbözo parancsot tartalmaz, amelyeket interaktív háromdimenziós alkalmazások készítésére használhatunk. Az OpenGL-t úgy tervezték, hogy hálózatos környezetben lehessen használni. Az ügyfél gép (client) az, amely az OpenGL-alapú alkalmazást futtatja, a rajzoló parancsokat küldi. A kiszolgáló gép (server) pedig az, amely az elküldött parancsokat megkapja, végrehajtja a rajzolást és visszaküldi a megjeleníteni kívánt képet. A kiszolgáló és az ügyfél gép közötti adatátvitel (protokoll) elore definiált, így nem jelent problémát, ha a két számítógép különbözo operációs rendszerrel muködik. Ha egy OpenGL-alapú alkalmazás nem hálózaton fut, hanem egy számítógépen, akkor az egyszerre lesz ügyfél és kiszolgáló is. Az OpenGL-t modern, hardverfüggetlen interfésznek tervezték, azért, hogy bármely hardveren implementálni tudják. Ennek érdekében viszont le kellett mondani az ablakkezelo funkciókról, a kezelo felülethez kapcsolódó részekrol. Hasonló meggondolásokból az OpenGL nem tartalmaz olyan parancsokat, amelyek magasszintu háromdimenziós objektumok leírására szolgálnának. Természetesen van rá lehetoség, hogy olyan összetett alakzatokat definiáljunk, mint pl. egy autó, testrész, repülogép stb. Az alapkoncepció viszont az, hogy a kívánt modelleket kisszámú geometriai primitívbol építsük fel – pontokból, vonalakból és poligonokból.

Az OpenGL lehetoségei:
  • a színtér definiálása háromdimenziós primitívekkel
  • nézopont definiálása,
  • s színtérrol drótvázas modell készítése
  • megvilágítási modell használata
  • a megvilágított színtérrol árnyalt (flat / smooth shaded) modell készítése (ebbe természetesen beletartozik a z-pufferelés, a nem-látható részek eliminálása stb.)
  • árnyékok és textúrák alkalmazásának lehetosége
  • antialiasing: a közel vízszintes vagy függoleges vonalak a képernyon lépcsozetesnek tunnek, ez a technika „kisimítja a ráncokat"
  • motion blur: mozgó objektumok körvonalai mozgás közben elmosódnak, a motion blur ezt a hatást kelti
  • atmoszféra effektusok keltése (pl. köd)

    Egy peldán keresztul megismerjuk a parancsokat

    Mivel az OpenGL-t igen sok mindenre lehet használni, egy OpenGL program igen bonyolult is lehet. Ám a program alapveto struktúrája nagyon egyszeru: eloször beállítunk bizonyos állapotokat, amelyek a megjeleníteni kívánt képek elkészítését vezérlik. Majd specifikáljuk a megjeleníteni kívánt objektumokat. Az alábbiakban egy OpenGL-alapú program részletét közöljük, amely egy fehér négyzetet rajzol ki a fekete háttérre:


    glClearColor (0.0, 0.0, 0.0, 0.0);
    glClear (GL_COLOR_BUFFER_BIT);
    glColor3f (1.0, 1.0, 1.0);
    glOrtho (-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);
    glBegin (GL_POLYGON);
      glVertex2f (-0.5, -0.5);
      glVertex2f (-0.5, 0.5);
      glVertex2f (0.5, 0.5);
      glVertex2f (0.5, -0.5);
    glEnd ();
    glFlush ();

    A glClearColor függvénnyel állítjuk be a háttér színét feketére. Ahogy itt is látható, az OpenGL támogatja az RGBA színmodellt. A glClear függvénnyel a letöröljük a képernyot. A glColor3f-fel a kirajzolni kívánt négyzet színét állítjuk be. A glOrtho-val egy olyan perspektivikus mátrixot definiálunk, amely párhuzamos vetítést definiál – benne megadva a vágó síkokat (clipping planes). A glBegin mögött megmondjuk, hogy poligont kívánunk definiálni, majd megadjuk a poligon csúcspontjait. Ahogy ebbol a példából is látható, nem kötelezo bezárni a poligont. Ha ezt nem tesszük meg, akkor a rendszer automatikusan megteszi ezt helyettünk. A glEnd-del fejezzük be a poligon definiálását. A glFlush-sal pedig végrehajtatjuk a pufferben várakozó OpenGL parancsokat. A 1. pontban leírtaknak megfeleloen, ez azt jelenti, hogy az ügyfél gép a pufferében levo rajzoló parancsokat összegyujti, majd elküldi a kiszolgáló gépnek, amely végrehajtja azokat és visszaküldi a megjeleníteni kívánt képet, amely az ügyfél gép képernyojén lesz látható.

    Az OpenGl parancsok szintaxisa.

    Ahogy a fenti programrészletbol kitunhetett, az OpenGL parancsok gl elotaggal kezdodnek és minden szó nagybetuvel kezdodik (pl. glClearColor). Hasonlóan az eloredefiniált konstansok GL - sal kezdodnek, nagybetukkel vannak írva, a szavak között aláhúzásjelet használnak (pl. GL_COLOR_BUFFER_BIT). Bizonyára az is feltunt, hogy néhány parancs nevében extra jelek találhatók (pl. 3f a glColor3f-ben). Ezzel az azonos függvények különbözo paraméterezéseit jelentik. A hármas azt jelzi, hogy három paramétert kívánunk átadni. Az f betu pedig azt, hogy lebegopontos számokat adunk meg paraméterként. Az alábbi táblázatban összefoglaltuk az ANSI C-beli numerikus típusokat és a megfelelo OpenGL adattípusokat:

    Utótag Adattípus C-beli típus definíció Megfelelő OpenGL típus
    b 8-bites előjeles egész signed char GLbyte
    s 16-bites előjeles egész short  GLshort
    i 32-bites előjeles egész long  GLint, GLsizei
    f 32-bites előjeles lebegőpontos szám float  GLfloat, GLclampf
    d 64-bites előjeles lebegőpontos szám double GLdouble, GLclampd
    ub 8-bites előjel nélküli egész unsigned char GLubyte, GLboolean
    us 16-bites előjel nélküli egész unsigned short GLushort
    ui 32-bites előjel nélküli egész unsigned long GLuint, GLenum, GLbitfield

    Tehát a glVertex2i (1, 3) és a glVertex2f (1.0, 3.0)ugyanazt a parancsot jelentik, csak különbözo paraméterezéssel. Néhány OpenGL parancsnak az utolsó betuje a v, amely tömböt jelöl. Jónéhány parancsnak megvan a tömbös és nem-tömbös verziója is. A következo példában az aktuális szín beállítását mutatjuk be, eloször – a már ismert – nem-tömbös módon, majd a tömbös verzióval:

    glColor3f (1.0, 0.0, 0.0);

    float color_array[] = {1.0, 0.0, 0.0}; glColor3fv (color_array);

    Az OpenGl mint állapot-automata.

    Az OpenGL egy állapot-automata: változtatható állapotokkal (másképp mondva: módokkal) rendelkezik, amelyek a megváltoztatásukig fenntartják az állapotukat. Így a bevezeto példában látott aktuális szín is egy állapot-változó, hisz miután beállítjuk a színt, bármit is rajzolunk, az ezzel a színnel fog megjelenni – mindaddig, míg meg nem változtatjuk. Az aktuális szín egyike az OpenGL-ben megtalálható állapotváltozóknak. A többi olyan tevékenységeket vezérelnek, mint pl. a projekciós transzformációkat, a poligon rajzolási módokat, a lámpák pozícióját és karakterisztikáját, az objektumok anyagjellemzoit. Jónéhány állapotváltozó kétértéku: ki- és bekapcsolni lehet oket a glEnable() és a glDisable() függvényekkel. Minden állapotváltozónak van egy eloredefiniált kezdeti értéke. Természetesen, nemcsak beállítani lehet ezeket a változókat, hanem bármikor le is kérdezhetjük az aktuális értéküket. Jellemzo a következo négy függvény használata – attól függoen, hogy milyen típusú adatot szeretnék visszakapni: glGetBooleanv(), glGetDoublev(), glGetFloatv(), glGetIntegerv(). Vannak ezeknél speciálisabb lekérdezo függvények is, így pl. a glGetLightfv(). Gyakran lehet szükségünk arra, hogy az aktuális állapotokat lementsük, majd egy késobbi idopillanatban visszaállítsuk. Ezekre a glPushAttrib() és a glPopAttrib() parancsokat lehet használni.

    Az OpenGl és a Windows kapcsolata.

    A Windows NT 3.5-ös verziójának megjelenése óta az OpenGL része az operációs rendszernek. A Microsoft a Windows 95-höz is már kihozta a megfelelo dll-eket, míg a Windows 98-be már „beépítve" szállítják.
    Szabo Gergely Pal G-2IN4

    2002.10.06

    szabo6@iit.uni-miskolc.hu