Robert Sajko
Kao trenutno najbolje rješenje za aproksimiranje globalnog osvjetljenja, odabrana je kombinacija zaklanjanja ambijenta te difuzne interrefleksije u prostoru slike, dakle, SSAO te SSGI algoritam. Premda ovo rješenje ima određena ograničenja (kako je opisano u prethodnim poglavljima), rezultati su zanimljivi, uz vrlo dobre performanse te jednostavnost implementacije. Međutim, budući da je riječ o efektima u prostoru slike, koji se baziraju na dostupnosti G-spremnika, potrebno je implementirati kompletan sustav iscrtavanja s odgodom. Također, za jednostavno testiranje učinaka raznih algoritama i efekata, potreban je i sustav prozora, kojim bi bilo moguće izgraditi jednostavno korisničko sučelje. Nadalje, potrebna je i funkcionalnost učitavanja proizvoljnih testnih scena, te njihov učinkovit prikaz u memoriji računala. Iz tog razloga, odlučeno je temeljiti programsku izvedbu na sustavu grafa scene. Jedna mogućnost jest koristiti gotovo rješenje poput OpenSceneGraph paketa, no takvi paketi nude mnoštvo mogućnosti, od čega bi velika većina bila nepotrebna u ovom konkretnom slučaju. Iz tog razloga, dizajniran je vlastiti, maleni i efikasni sustav grafa scene. Također, umjesto direktne izvedbe korisničkog sučelja putem Windows API-ja (odnosno, neke intermedijarne biblioteke poput wxWidgets-a) i kombiniranja tog sučelja sa slikom iscrtanom kroz Direct3D ili OpenGL grafičko sučelje, odabrana je opcija direktne implementacije sustava prozora kao dijela grafa scene. Prema tome, umjesto korištenja dva odvojena sustava iscrtavanja (jedan za korisničko sučelje, što omogućava sam operacijski sustav, te drugi za scenu), koristi se samo jedan, vlastito implementirani sustav iscrtavanja temeljen na Direct3D grafičkom sučelju. Prozori koji sačinjavaju korisničko sučelje su tek objekti na sceni, ni po čemu drugačiji od ostalih objekata unutar grafa scene (osim što su dvodimenzionalni), te ih sustav za iscrtavanje niti ne raspoznaje. Ovime su izbjegnuti mnogi problemi i poteškoće koji mogu nastati prilikom sinkronizacije dvaju odvojenih sustava iscrtavanja, te je sama programska izvedba uvelike pojednostavljena. Modularnost ovakvog dizajna je omogućila razvoj pojedinih podsustava u obliku neovisnih komponenti, koje su sve povezane te komuniciraju putem centralne strukture grafa scene. Konkretno, postoje tri takve komponente - iscrtavatelj (eng. renderer), upravljač prozorima (eng. window manager), te upravljač resursima (eng. resource manager). Jasno, sve su komponente reaktivne, te se svaka odvija u zasebnoj dretvi. Iscrtavatelj pristupa grafu scene kao skupu ulaznih podataka, te iscrtava sve objekte obuhvaćene grafom. Upravljač prozorima manipulira grafom prozora, što je podgraf cjelokupnog grafa scene, i to na temelju korisničkih akcija (pomaci miša, pritisci tipaka, itd). Rezultati ovih promjena se zatim očituju u iscrtanoj slici, bez da iscrtavatelj bude svjestan na koji način su se ove promjene dogodile, ili da se uopće jesu dogodile. Riječ je o sličnom ustroju kao kod Model-Pogled-Upravljač obrasca, no s tom razlikom da nema potrebe za korištenjem obrasca Promatrača za komunikaciju između komponenti, budući da su sve reaktivne (izvršavaju se neprekidno i opetovano, za vrijeme trajanja programa). Dakako, umjesto toga, potrebno je koristiti odgovarajuću tehniku sinkronizacije između dretvi, kao što su mutex objekti. Također, na jednostavan je način moguće dodati i komponentu za fiziku. Proračunom sila i drugih fizikalnih veličina, ova bi komponenta manipulirala objektima u grafu scene, što bi bilo transparentno za ostatak sustava. Konačno, upravljač resursima koristi graf scene i kao ulaz i kao izlaz. Dodavanjem novog objekta u graf scene (ili putem korisničkog sučelja, dakle, putem upravljača prozora, ili programski iz bilo kojeg dijela programa), ukoliko taj objekt sadrži referencu na geometrijski model ili teksturu koja nije još učitana, iscrtavatelj će preskočiti iscrtavanje takvog objekta (budući da ne postoje potrebni resursi), te doznačiti upravljaču resursa da je potrebno učitavanje. Dretva upravljača resursa je u stanju mirovanja, sve dok ne pristigne zahtjev za učitavanjem. Implementirane su dvije vrste zahtjeva - blokirajući, te neblokirajući. Kod prvog tipa zahtjeva, pozivajuća dretva se zaustavlja dok učitavanje nije dovršeno, dok kod drugog tipa, pozivajuća dretva može nastaviti s radom. Dakako, iscrtavatelj koristi upravo neblokirajuću vrstu zahtjeva za učitavanjem, tako da se iscrtavanje može nastaviti i dok se u pozadini vrši učitavanje dodatnih resursa. Svi resursi se održavaju u pričuvnoj memoriji (u obliku hash-tablice), sve dok su u upotrebi, odnosno, dok na njih postoji barem jedna referenca unutar grafa scene. Jednom kad broj referenci nekog resursa padne na nulu, upravljač resursima oslobađa taj resurs. Na taj način, omogućeno je konstantno dodavanje novog sadržaja u graf scene uz oslobađanje nepotrebnih resursa, bez prekida za učitavanje. Ovo svojstvo je posebice korisno, primjerice, za prostrana, otvorena virtualna okruženja, koja zbog svoje veličine nikako ne bi mogla biti učitana u memoriju odjednom i u cijelosti. Za samo učitavanje modela i tekstura u raznim formatima, korištena je malena ali moćna pomoćna biblioteka Assimp (skraćeno od Asset Import Library). Ovime su ukratko pokriveni temelji grafičkog pogona razvijenog za potrebe testiranja raznih algoritama opisanih u okviru ovog diplomskog rada. Posebice je zanimljiva komponenta iscrtavatelja, budući da su unutar ove komponente implementirani svi opisani postupci, poput osvjetljenja s visokim dinamičkim rasponom, preslikavanja sjena, te zaklanjanja ambijenta i difuzne interrefleksije. Za čim jednostavnije dodavanje raznih efekata pri iscrtavanju, razvijen je objektni model prikladan domeni. Koncepti kao što su G-spremnici su enkapsulirani odgovarajućim razredima. Također, budući da je sve navedene algoritme potrebno implementirati na grafičkoj kartici, i koncept programa za sjenčanje je enkapsuliran zasebnim razredom. Na taj način, omogućeno je vrlo jednostavno dodavanje novih efekata i povezivanje njihovih ulaza i izlaza na odgovarajuće spremnike. Kompletan postupak iscrtavanja, te međusobni ustroj pojedinih prolaza i faza, grafički je prikazan slikom 33.
|