<< >> Title Contents Index

9. OpenGL Windows-ympäristöissä


Kun SGI vuonna 1992 esitteli OpenGL:n, oli yhteistyö Microsoftin kanssa jo alkanut. Windows NT:n versiossa 3.5 OpenGL oli ensimmäisen kerran liitetty valmiiksi tiettyyn ympäristöön. OpenGL:n ensimmäinen versio ei kuitenkaan toiminut kunnolla Windows 95:n kanssa, joten myös Windows 95:ssa toimiva versio 1.1 ilmestyi markkinoille joulukuussa 1995. OpenGL:n toinen versio on myös suorituskyvyltään edeltäjäänsä parempi.

9.1. Käännösyhteys (rendering context)

Vaikkei tämä moniste puutu OpenGL:n rajapinnan toteutustapaan, on OpenGL-ohjelmoinnista Windows-ympäristössä mahdotonta puhua ilman käsitettä käännösyhteys (rendering context) [1]. Windows-ohjelmoinnissa jokaisella ikkunalla on oma laiteyhteys (device context), joka vastaanottaa graafiset toimenpiteet. Ikkunaan tapahtuvat piirrot ja kirjoitukset vaativat GDI (Graphical Device Interface) -aliohjelmia, jotka ohjataan tietylle laiteyhteydelle. Samaan aikaan voi olla auki useampia laiteyhteyksiä, mutta yhdellä ikkunalla voi olla ainoastaan yksi laiteyhteys kerrallaan.

Koska laiteyhteys on ainoastaan Windows-ohjelmoinnissa käytettävä käsite, samoin kun GDI ja kahvat, ei niitä käsitteleviä aliohjelmia ole voitu sisällyttää OpenGL:ään laitteistoriippumattomuuden säilyttämiseksi. OpenGL tarvitsee siten omia käännösyhteyksiä, joihin piirtorutiinit voidaan ohjata. Käännösyhteys "tulkkaa" piirtorutiinit laiteyhteydelle, jolle ne halutaan suoritettavan. Tietyllä hetkellä voi olla ainoastaan yksi aktiivinen käännösyhteys, jolle OpenGL:n piirtorutiinit ohjataan (katso Kuva 9.1.)


Kuva 9.1. Miten OpenGL piirtorutiinit löytävät ikkunansa.

9.2. OpenGL + Win32 = Wiggle

Tähänasti esitellyissä esimerkkiohjelmissa ikkunoiden alustukset ja avaukset tehtiin GLAUX-aliohjelmakirjaston aliohjelmien avulla. Näillä aliohjelmilla on mahdollista tehdä sovellus, jossa on vain yksi ikkuna. Sovellus ei kuitenkaan sisällä menuja, tulostusmahdollisuuksia, dialogeja, eikä oikeastaan mitään Windows-ohjelmalle olennaisia toimintoja. Koska käytössä on ainoastaan yksi ikkuna, tiedetään aina mihin ikkunaan piirrot suoritetaan. Windows-sovelluksissa on useimmiten useampia ikkunoita. Ne ovat (useimmiten) joko SDI-(Single Document Interface) tai MDI (Multiple Document Interface) -tyyppisiä sovelluksia.

OpenGL sisältää muutamia aliohjelmia, jotka on tarkoitettu ainoastaan Windows-ohjelmointia varten. Aliohjelmat tunnistaa etuliitteestä wgl_ ja niitä kutsutaankin Wiggle-aliohjelmiksi.

9.3. Wiggle-aliohjelmien käyttö

Wiggle-aliohjelmien avulla OpenGL:n piirtorutiinit ohjataan haluttuun ikkunaan. Ensimmäinen vaihe on käännösyhteyden luonti, joka toteutetaan aliohjelmalla wglCreateContext(HDC). Se palauttaa kahvan käännösyhteyteen (HGLRC). Kun käännösyhteys on luotu, täytyy se valita aktiiviseksi aliohjelmalla wglMakeCurrent(HDC, HGLRC). Se palauttaa boolean-arvon riippuen, onko aktivointi onnistunut. Jotta käännösyhteyden aktivointi onnistuisi, on sillä oltava tiettyjä samoja ominaisuuksia kuin laiteyhteydellä. Tarvittavat samat ominaisuudet saavutetaan pikselin arvoja (pixel format) muokkaamalla. Kun käännösyhteys on valittu aktiiviseksi, voidaan OpenGL:n piirtorutiineja käyttää. Kun piirtorutiinit on suoritettu, täytyy käännösyhteys ensin poistaa aktiivisesta tilasta, jonka jälkeen se on tuhottava. Poisto aktiivisesta tilasta tapahtuu samalla aliohjelmalla kuin aktivointikin viemällä käännösyhteyden kahvaksi NULL, eli wglMakeCurrent(HDC, NULL). Poisto voidaan tehdä myös valitsemalla toinen käännösyhteys aktiiviseksi. Käännösyhteys tuhotaan aliohjelmalla wglDeleteContext(HGLRC).

9.4. Ikkunan käyttöönotto

Ikkunan alustamisessa on otettava huomioon, että sekä tyyli WS_CLIPCHILDREN että WS_CLIPSIBLINGS täytyy olla valittuina, eikä tyyliä CS_PARENTDC saa valita. Tyylin WS_OWNDC valinta saattaa joissain tapauksissa parantaa piirtämisen nopeutta.

    BOOL CMfcgView::PreCreateWindow( CREATESTRUCT& cs )
    {
      // Määritellään ikkunan tyylit ennen sen luomista
      cs.style |= ( WS_CLIPCHILDREN | WS_CLIPSIBLINGS | WS_OWNDC );
      return CView::PreCreateWindow( cs );
    }

Kun ikkunan kokoa muutetaan tai ikkunaa joudutaan muuten päivittämään, saa ohjelma viestin WM_ERASEBACKGROUND. Tämän ansiosta ikkuna putsataan ja vasta sen jälkeen piirretään uudelleen, joten päivitys saattaa aiheuttaa epämiellyttävää välähtelyä. Ongelma ratkeaa poistuttaessa taustan putsauksesta huolehtivasta metodista ilman, että se suorittaa mitään toimenpiteitä.

    BOOL CMfcgView::OnEraseBkgnd( CDC* pDC )
    {
      return FALSE;
    }

Kuvassa 9.2. olevan ikkunan alustaminen ja neliön piirtämiseen tarvittavat piirtorutiinit on esitetty liitteessä 2, jossa ovat tiedostot WinVSXWView.cpp ja WinVSXWView.h.


Kuva 9.2. MFCView.

[1] Käännösyhteys on monisteen kirjoittajan vapaa käännös rendering contextille.


<< >> Title Contents Index