OpenGL ja Linux – 3D grafiikan alkeet

OpenGL on määritelty kokonaan ns. sinisessä kirjassa (OpenGL 4.5 Blue book). Esimerkkikoodeja ja käytännöllistä apua tarjoaa taas puolestaan Red book. (RedBook -esimerkit OpenGL 3D-koodia)

"Sinisen kirjan" laajuus voi hätkähdyttää. Toisaalta siihen kannattaa suhtautua enemmänkin käsikirjana. Lisäksi tuota isoa sivumäärää selittää se, että myös OpenGL -standardia noudattavien laitteiden valmistajien pitää saada erittäin tarkka kuvaus rajapinnasta. Eli kaikki ei suinkaan kosketa normaali ohjelmoijaa, joka työskentelee rajapinnan "tällä puolen", käyttäjänä.

3D-grafiikassa peruskysymys on: miten luoda 2-ulotteiseille ("sileälle") näytölle kuva, joka saa ihmisen ajattelemaan, että hän katselee aitoa kolmiulotteista tilannetta?

Tätä on tahkottu aina 1970-luvulta asti. Tietokonegrafiikka on kulkenut mielenkiintoisen kehityspolun. Alkuun jokainen ohjelmoija teki asiat aivan alusta alkaen itse, käsin ohjelmoimalla. Oli pakko opetella matriisien matematiikkaa (matriisialgebraa) ainakin jollain perustasolla. Tietokoneiden tehot olivat noin 1/1000 nykyisestä, eikä erillistä grafiikan piirtoon erikoistunut tehostinpiiriä ollut vielä olemassa (GPU - graphics processing unit). Asiat olivat siis varsin visaisia.

Toisaalta edelleen, 2018, voi olla hyvä tietää perusteet ihan ruohonjuuritasolta alkaen. Se ei enää tosin ole pakollista. Voit aivan hyvin alkaa tehdä pelejä tai muuta 3D-grafiikkaa vaativia ohjelmia ilman raskasta teoriaa koodauksesta.

Pää pinnalla - esimerkkejä valmiina

Kuten sanoin, erityisesti 3-ulotteisen grafiikan ohjelmoinnissa voi tulla joskus liikaa konsepteja vastaan. Hahmotan itse tietokonegrafiikan siten, että on olemassa hyvin yksinkertainen geometrian säännöstö - se, miten tietokone simuloi meidän ihmisten kokemaa valon kulkua (ja lopulta aivojen tulkintaa siitä). Tietokone pyritään saamaan  piirtämään sellaisia muotoja (pikseleitä käyttäen) jotka saavat tilan illuusion aikaiseksi.

Loput on "kuorrutusta" eli jos käytettäisiin ohjelmoinnista ja tietojenkäsittelytieteestä tuttua termiä, niin se olisi "sugaring" tai syntactic sugar. Ohjelmoinnissa on myös samoin hyvin yksinkertainen ydin: aritmetiikka ja bittien siirtely paikasta toiseen. Kaikki muu on lisättyä sokeria.

Toisaalta, jos käy niin että tuntuu tulevan liikaa konsepteja vastaan, tällöin voit hyödyntää aivojen luovaa tilaa - esimerkit yllä saattavat antaa suoraan oivalluksia, jos ajat ne koneellasi. Älä tartu vielä kovin paljoa lähdekoodiin, jos siltä tuntuu.

Miten esimerkkiohjelmista voi oppia?

Käännä ohjelmakoodi yksi kerrallaan; sen jälkeen aja ohjelma, katso mitä tapahtuu -- ja opiskele termejä.

Lisään kunnollisen sanaston pian tänne. Joskus englanninkieliset erikoistermit karkottavat tehokkaasti, koska ne saattavat olla avainasemassa tietyn konseptin oppimisessa. Erityisesti kun mennään grafiikassa jälkikäsittelijöiden ("shaders") eli erilaisten efektien pariin, tulee muutamia uusia termejä.

Redbook -ohjelmaesimerkkien kääntäminen

RedBook tarjoaa hyvin yksinkertaisia C-kielisiä lähdekoodeja OpenGL:stä. Ne kannattaa kääntää ja ajaa. Koska jokainen esimerkki menee mekaanisesti samanlaisella kääntökomennolla, senkin voi skriptata halutessaan.

Otetaan Redbook -arkisto levylle

Otetaan kerralla koko paketti RedBookin lähdekoodeista, ja puretaan se:

wget https://www.opengl.org/archives/resources/code/samples/redbook.zip
unzip  redbook.zip

Nyt esimerkit ovat juuri luodussa kansiossa "redbook", joten mennään tutkimaan:

cd redbook

Red Bookissa on 56 erilaista C-kielistä listausta. Jokainen kääntyy samalla tavalla.

Alla pieni osa ohjelmista:

$ ls -la

Otetaan ensimmäisenä lyhyin listaus (tai oikeastaan, pienin tiedosto).

gcc cube.c -o cube -lGL -lGLU -lglut

gcc on aika hiljainen, joten jos kaikki meni ok, niin näet vain shellisi kehotteen. gcc on tehnyt 'cube' nimisen ajettavan ohjelman (käännöstuotteen nimen voi antaa -o vivun avulla, kuten yllä)

Tuloksena siis ajettava ohjelma 'cube'. Käynnistetään:

./cube

 

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.