11.07.2015 Views

2014.1.futuro

2014.1.futuro

2014.1.futuro

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

KoodiOpenGL-ohjelmointi: grafiikkamoottoriSarjan kolmessa edellisessä osassa olemme esitelleet OpenGL:n tärkeimmät ominaisuudet.Nyt niputamme kaiken yhteen ja rakennamme yksinkertaisen grafiikkamoottorin.Teksti: Mikko Rasa Kuvat: Mikko Rasa, Teija TuhkioAlkuun varoituksen sana:laadukkaan grafiikkamoottorintekeminen on valtava urakka.Älä siis odota tekeväsi seuraavaa UnrealEngineä pelkästään tämän artikkelinohjeilla. Oman grafiikkamoottorintekeminen on silti opettavaista jaauttaa myös ymmärtämään valmiidenmoottorien toimintaa paremmin.Grafiikkamoottori koostuu useista alijärjestelmistä,jotka tekevät yhteistyötäkeskenään. Tärkeimmät niistä ovat resurssienlataus ja hallinta, näkymäverkon(engl. scene graph) hallinta ja renderöinti.Monesti grafiikkamoottorit tarjoavatmyös animointitoimintoja. Laajemmissapelimoottoreissa on myös muita toimintojakuten törmäystarkistus, käyttäjänsyötteen käsittely ja skriptiohjelmat.Tässä artikkelissa keskitymme kuitenkingrafiikkaan.Grafiikkamoottorin voi rakentaa monellatavalla, eikä tässä artikkelissa oletilaa esitellä niitä kaikkia. Jos jokin ratkaisuei miellytä, kokeile rohkeasti toistalähestymistapaa.Artikkelin mukana tuleva esimerkkikoodion toimiva grafiikkamoottori muttaei toteuta kaikkia tässä esiteltyjä ominaisuuksia.Puuttuvien asioiden kohdallaon artikkelissa Puuttuu-merkintä. Lukijavoi halutessaan etsiä näistä aiheista lisätietoainternetistä ja kehittää moottoriaeteenpäin.Yleinen arkkitehtuuriAllekirjoittanut ei useinkaan tee tarkkojasuunnitelmia etukäteen, mutta jonkinlainenyleiskuva on hyvä muodostaa. Kutenaiemmissakin esimerkkiohjelmissa,moottorin toteutuskielenä on C++. Olioohjelmointion myös luonteva valinta.Globaalit muuttujat ja muut globaalittilat voivat tehdä ohjelman kulun seuraamisestaja virheiden etsimisestä vaikeaa,joten niitä on syytä välttää. Tämänhuomaa erityisen hyvin juuri OpenGL:nkanssa, jossa vaikkapa tekstuurin unohtaminensidotuksi jossain päin koodiavoi aiheuttaa virheellistä toimintaa aivanmuualla. Niinpä piilotamme OpenGLtoiminnotkokonaisuudessaan moottorinrajapinnan taakse, jossa tiloja voidaanmuuttaa hallitusti.Koska ohjelmat käyttävät grafiikkamoottoriakirjastona, on moottorin luokatja funktiot syytä nimetä niin, että vältytäänyhteentörmäyksiltä toisten kirjastojenkanssa.Käytön helpottamiseksi teemmemoottorille pääluokan, joka tekee kaikentarvittavan alustuksen. Lisäksi sinne voidaansijoittaa tietyt ylätason toiminnot,kuten kokonaisen ruudun renderöinti.Vältämme kuitenkin muiden luokkien tarpeetontasitomista pääluokkaan, jolloinniiden uudelleenkäytettävyys paranee.C++:n muistinhallinnan väitetäänolevan vaikeaa, mutta sen ei tarvitseolla sitä. Kun heti projektin alussa päättääpelisäännöt muistinkäytölle, välttyyuseimmilta ongelmilta. Skrolli-moottorinesimerkkitoteutuksessa käytämme omistajuusperiaatetta,eli olion luonut luokkaon vastuussa myös sen tuhoamisesta.Käytämme myös pinosta varattuja olioita,aina kun se on järkevää.Virhetilanteiden raportointiin käytämmepoikkeuksia. Muihin virheenkäsittelytapoihinverrattuna niiden etunaon helppokäyttöisyys. Käsittelemättömätpoikkeukset pysäyttävät ohjelman suorituksen,eivätkä virheet jää huomaamatta.Myös poikkeuksen kaappaaminen debuggerissaon helppoa. Moderneilla kääntäjilläpoikkeuksien käyttö ei tee koodistahitaampaa, joten ainoaksi haittapuoleksijää hieman suurempi ohjelman koko.ResurssienhallintaResurssienhallinnan tehtävänä on ladataohjelman tarvitsemia resursseja levyltä japitää kirjaa jo ladatuista resursseista. Jossamaa resurssia pyydetään uudestaan,resurssienhallinta voi antaa valmiiksi ladatunesiintymän.Resursseihin on pystyttävä viittaamaanjotenkin, joten annamme niille nimet.Suoraviivaisinta on käyttää tiedostonimiä.Resursseja on myös helpointakäsitellä työstövaiheessa erillisinä tiedostoina.Myöhemmin resurssienhallintaanvoidaan lisätä vaihtoehtoisia lataustapoja,kuten vaikkapa tuki zip-tiedostoille.Tärkeimmät resurssityypit ovat objekti,shader-ohjelma ja tekstuuri. Lisäksitarvitaan joitakin aputyyppejä, jotka eivätkuvaa mitään OpenGL:n olioita vaanauttavat muiden resurssien hallinnassa.Tekstuurit ovat yksinkertaisesti kuvatiedostoja.Yleisissä kuvaformaateissa eiole mahdollista helposti määritellä lisäominaisuuksiakuten suodatusta tai toistoa,joten käytämme kaikille tekstuureillesamoja asetuksia.Shaderit ladataan GLSL-kielisestälähdekoodista. Koska kokonaiseen sha-48 2014.1

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!