OpenGL/Tapahtumien käsittelyyn perustuva rakenne

Ennen kuin päästään piirtämään grafiikkaa, sitä varten tulee luoda ikkuna. Tämä kirja käyttää siihen eleganttia GLUT-kirjastoa (OpenGL Utility Toolkit). GLUT toimii yksinkertaisemmin mutta samalla periaatteella kuin käyttöjärjestelmän oma käyttöliittymäkirjasto.

Tyypillinen GLUT-pääohjelma tekee kolme asiaa:

  • luo ikkunan
  • nimeää tapahtumienkäsittelijät
  • siirtyy suorittamaan päättymätöntä tapahtumienkäsittelysilmukkaa

GLUT alustetaan antamalla funktiolle glutInit osoittimet komentoriviparametreihin:

int main(int argc, char** argv) {
    glutInit(&argc, argv);
    ...

Syy on siinä, että komentoriviltä voi tehdä GLUTiin liittyviä valintoja. Komento glutInit käsittelee ne ja poistaa käsittelemänsä komentoriviparametrit häiritsemästä.

Ikkunan luominen muokkaa

Ikkunan luomiseksi asetetaan muutama alkuarvo glutInit-alkuisilla funktioilla, ja lopuksi kutsutaan glutCreateWindow-funktiota.

glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(500, 500);
glutInitWindowPosition(100, 100);
glutCreateWindow("Ikkunan otsikko");
  • glutInitDisplayMode(valinnat) asettaa ikkunan näyttötilan: valitsee käytetyn värijärjestelmän ja ottaa käyttöön erilaisia grafiikkapuskureita.
  • glutInitWindowSize(leveys, korkeus) määrää luotavan ikkunan koon pikseleinä.
  • glutInitWindowPosition(x, y) säätää ikkunan paikan työpöydällä; koordinaatistossa origo on vasemmassa yläkulmassa ja y-akseli osoittaa alaspäin.
  • glutCreateWindow(otsikko) luo ikkunan aikaisemmin valituilla ominaisuuksilla.

Näyttötilan valintaan palataan, kun animaatiota ja grafiikkapuskureita käsitellään.

Tapahtumienkäsittely muokkaa

Tapahtumienkäsittelyyn perustuvat ohjelmat suorittavat päättymätöntä silmukkaa. Ohjelma herää henkiin, kun jotain kiinnostavaa tapahtuu. Tällaisia tapahtumia ovat muun muassa näppäimen painallus, hiiren liike ja ajastimen lyönti.

GLUTissa tapahtumankäsittelijä luodaan rekisteröimällä jokin aliohjelma sellaiseksi. Aluksi tärkein tapahtuma on piirtopyyntö: jos ikkuna tulee esiin piilosta, käyttöjärjestelmä pyytää sitä piirtämään uudestaan sen sisällön. Komento glutDisplayFunc(aliohjelma) rekisteröi aliohjelman piirtopyynnön käsittelijäksi. Aliohjelmalla ei saa olla parametreja tai paluuarvoa.

void piirto(void)
{
    ...
}

int main(int argc, char** argv)
{
    ...
    glutDisplayFunc(piirto);
    ...
    glutMainLoop();
    ...

Piirtopyynnön voi saada itsekin aikaan komennolla glutPostRedisplay().

Erilaisia tapahtumienkäsittelijöitä on runsaasti. Alla on esitelty muutama niistä.

glutReshapeFunc(aliohjelma)

Ikkunan koko muuttuu. Aliohjelman täytyy olla muotoa: void koon_muutos(GLsizei leveys, GLsizei korkeus). Jos käsittelijää ei määritellä, GLUT suorittaa automaattisesti komennon glViewport(0, 0, leveys, korkeus); siitä lisää myöhemmin.

glutKeyboardFunc(aliohjelma)

Näppäintä painettiin. Aliohjelma on muotoa: void nappainpainallus(unsigned char ascii, int hiiren_x, int hiiren_y).

glutIdleFunc(aliohjelma)

Mitään ei tapahdu. Kun tapahtumia ei ole käsiteltävänä, on hyvää aikaa vaikkapa animoida jotain toissijaista. Aliohjelman tulee olla muotoa: void seisokki(void).

Kun tapahtumienkäsittelijät on rekisteröity, on aika siirtyä päättymättömään tapahtumankäsittelysilmukkaan käskyllä glutMainLoop().

Huomautuksia muokkaa

  • Tapahtumat käsitellään peräkkäin, joten säikeistä ei tarvitse huolehtia.
  • Kyllä glutMainLoop pysähtyy, kun ikkuna suljetaan.
  • GLsizei on OpenGL:n nimeämä tyyppi (typedef), hieman kuin size_t tai unsigned int.
  • Tässä vain raapaistaan rajapintaa. GLUTin täydellinen kuvaus on nimeltään The OpenGL Utility Toolkit (GLUT) Programming Interface API Version 3 Specification.
  • GLUT on tarkoitettu lähinnä opiskelukäyttöön.

Jos sinulla on tarkennettavaa tästä luvusta etkä keksi mihin sen lisäisit, lisää se tähän.

Harjoituksia muokkaa

  • Kokeile venyttää edellisen kappaleen GLUT-testiohjelman ikkunaa. Mitä kolmiolle tapahtuu?
  • Komento glutFullScreen() tekee ikkunasta koko ruudun kokoisen, josta sen saa takaisin käskyllä glutReshapeWindow(leveys, korkeus). Ikkunan leveyden ja korkeuden voi noutaa käskyillä glutGet(GLUT_WINDOW_WIDTH) ja glutGet(GLUT_WINDOW_HEIGHT). Muokkaa testiohjelmaa niin, että F-näppäin vaihtaa kokoruututilaan ja takaisin.
  • Tutki GLUTin API-kuvausta. Tee ohjelma, joka luo uuden ikkunan. Ohjelman tulee sammua, kun ikkunan sisustaa napsauttaa hiirellä. (Vakiokirjaston exit lopettaa ohjelman.)

Miten sinä olet oppinut jotakin hyödyllistä ja mielenkiintoista GLUTin avulla? Lisää se harjoitukseksi.