3D-grafiikkaa Linuxilla, osa 1: alkulätinät

3D -grafiikka on mielenkiintoinen aihe, siinäkin mielessä että usein ensi-innostuksen jälkeen aihepiiri voi jäädä hyllylle. Grafiikka voi toisaalta olla elämänpituinen intohimo, sekä tuleva ammatti.

Esittelen tässä sarjassa 3D-grafiikan alusta “loppuun”, niin että pääset kirjoittamaan koodia Linuxilla. Esimerkeissä käytetään OpenGL ja GLUT kirjastoja, mikä lienee kohtuullisen yleinen vaihtoehto. Kaupallisiin tai muihin valmiisiin pelialustoihin todennäköisesti ei tutustuta. Voi olla, että jos käytän myöhemmin jotain tällaista, siitä erillinen sarjansa.

Tässä jaksossa…

  1. höpistään hieman taustoja grafiikasta
  2. juodaan kahvia
  3. mietitään miksi vasta sarjan seuraavassa osassa päästään koodaamaan

Mutta – se on lopulta kaikki vain pikseleitä!

Grafiikan ideathan ovat universaaleja, mutta lopulta iteratiivisen testailun ja viihtymisen vuoksi jollain laitteistolla ja softakirjastoilla homma on lopulta tehtävä. Eli kädet on lyötävä saveen, ja koodia kirjoitettava.

Ideatasolla ymmärrämme jo ihmisenä mistä grafiikassa on kyse; näemmehän jatkuvasti erilaisia pintoja, esineitä, ihmiskasvoja, taivaan, jne ympärillämme. Grafiikkaohjelmoinnissa luodaan illuusio siitä, että se, mikä (usein 2-ulotteisella) ruudulla näkyy vain tasossa, esittää tuota oikeaa kolmiulotteista maailmaa.

Joskus 3D-ohjelmointia ensimmäisen kerran lähestyessä voi mielen vallata kaaos: erilaiset konseptit pulppuavat tulvana mieleen, ja mikäli ei naulaa tiettyjä perusasioita jämäkästi kiinni, voi olla, että ohjelmointi jää sikseen.

Anna esineille oma rauhansa

Esineet elävät omaa elämäänsä. Eli ne voidaan määritellä riippumatta, miten ne myöhemmin tulevat esiintymään 3D-maailmassa. Tämä on eräs fundamentaali oivallus, joka ainakin itselleni toi mielenrauhaa. Jos olet leikkinyt 3D-ohjelmilla, aika nopeasti idea kolmesta akselista (X,Y,Z) ja esineiden muodostuminen näihin alkaa tuntua luontevalta. Suosittelen nimenomaan “aivotonta kokeilua”. Silloin saa tuntumaa myös ohjelmointiin. Älä aluksi yritä tehdä mitään mestariteoksia.

Aivan mainioita harjoituskappaleita ovat säännölliset laatikot, kuin myös pyramidi, tangot, palikat.

Asenna vaikka Blender, joka on täysin ilmainen ja erittäin laadukas softa. Blenderillä on tehty elokuvia ja pelejä, mutta nyt alkuun siitä on iloa nimenomaan 3-ulotteisten esineiden muovaamisessa. Ohjelmoinnin kannalta Blender ei ole mitenkään pakollinen, mutta se on kiehtova softa jos mallinnus kiinnostaa.

Illuusion ytimessä: projisointi

Kolmiulotteisessa grafiikassa esineet piirretään tasoon (monitorille) siten, p_projektiot_seinaettä niiden muoto muuttuu antaen illuusion katselukulmasta ja esineen etäisyydestä katsojaan. Kun soppaan lisätään valaistus, varjot, ja muita efektejä, gourmé -ateria on valmis! Yksinkertaistettuna siis näin.

Teknisesti kyse on projisoinnista. Esineistä, joilla on 3-ulotteiset koordinaatit, piirretään meihin, “katsojan silmään”, viivat, ja nuo viivat katkaistaan ruudun (tason) kohdalla. Jos olemme esineen sisällä, esimerkiksi talossa, jätetään taaksemme menevät esineet vain piirtämättä (meillä ei ole silmää takaraivossa). Matemaattisesti kyse on suhteellisen yksinkertaisesta ratkaisusta: jos projisoidun pinnan syvyys (z-koordinaatti) on negatiivinen, sen voi jättää huomiotta.

 

Tietokonegrafiikka kehittyi mustavalkoisesta 2-ulotteisesta grafiikasta ensin värigrafiikkaan. Oli “kova juttu” että esimerkiksi PC:lle löytyi CGA -grafiikkaominaisuuksia tukevissa korteissa 3 omituista väriä ja lisäksi musta. CGA-grafiikka näytti tuolta vieressä olevalta.

Hiljalleen 1980-luvun tienoilla tietokoneisiin ohjelmoitiin (softalla) 3D-grafiikan rutiinit itse. Jokaisella ohjelmoijalla oli siis kivinen mutta toisaalta antoisa tie kuljettavanaan, koska pikselin- ja viivanpiirrosta lähtien kaikki piti tehdä itse. Bresenham oli tuolloin kova sana – keksijänsä mukaan nimetty algoritmi, jolla saatiin tehtyä mielivaltainen viiva kahden pisteen välille, siten että se ei näyttänyt “tyhmältä” eikä kuluttanut yhtään liikaa prosessoriaikaa.

Alkoi grafiikkakorttien valtakausi. 2D -piirtämisen oltua “riittävän hyvällä” tasolla kolmiulotteisten rutiinien kilpavarustelu oli tuleva taistelutanner seuraavien parinkymmenen vuoden ajan. Muistimäärät kasvoivat myös näytönohjaimissa reippaasti alkuperäisistä. Tavallaan modernin peligrafiikan taustalla on sopiva määrä elektroniikan ja ohjelmistojen kehitystä.

 

Mikä OpenGL on?

OpenGL tarjoaa rajapinnan grafiikkakorteille. Sen tarkoitus on eriyttää laitevalmistajakohtaiset yksityiskohdat, jotta ohjelmoijat voisivat tehdä heille mielekkäitä asioita sen sijaan että miettisivät eri valmistajien ja korttimallien kanssa temppuilemista.

OpenGL-kirjasto kulkee versiossa 4 tällä hetkellä. OpenGL on tavallaan hyvin matalan tason, laitteistoläheinen yhteys. Kirjasto tarjoaa siis C/C++ kielelle funktiot ja vakiot grafiikkakortin ohjaamiseen. OpenGL:n tärkeimpiä ominaisuuksia on ohjelmoitavuus: sen avulla voidaan luoda uusia efektejä, jotka tietenkin lopulta lankeavat grafiikkakortin suoritettavaksi, mutta näin päästään grafiikkaohjelmoinnissa liikkumaan hieman korkeammalla tasolla.

Kun laitevalmistajat tarjoavat uusia ominaisuuksia raudalla, OpenGL seuraa kehityksessä näitä.

Entä mikä on GLUT?

GLUT taas on pieni kehikko grafiikkaohjelman yleisimpien peruselementtien tekemiseksi. GLUT liittyy enemmän Linuxin työpöydän ikkunointiin ja sen sellaiseen. Eli GLUT helpottaa “toimivan” kokonaisuuden protoilua. OpenGL:n mielestä maailmassa on sen sjiaan vain olemassa raakoja suorakulmion muotoisia alueita näytöltä, joihin piirrellään pikseleitä. OpenGL ei ota kantaa “käytännöllisempiin” asioihin ohjelman rakentamisessa.

 

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s