Robert Sajko
Računanjem ambijentalnog zaklanjanja, proširili smo standardni lokalni model osvjetljenja, dodavši meke, ambijentalne sjene na scenu. Međutim, ambijentalne sjene su tek jedan od efekata globalnog osvjetljenja, koji nastaje uslijed difuzne interrefleksije. Još jedan efekt vezan uz višestruko odbijanje svjetlosti među objektima na sceni jest pretapanje boja. Naime, interrefleksijom difuznog osvjetljenja između dva objekta, doći će do promjene percipirane boje tih objekata, budući da će jedan utjecati na drugoga svojom refleksijom, tj. obojanom svjetlošću (vidjeti poglavlje 2). Opisana situacija jest rezultat jednostrukog odbijanja svjetla, no jasno, moguće je i višestruko odbijanje. Ukupan rezultat svog indirektnog osvjetljenja ćemo nazvati ambijentalnom komponentom osvjetljenja. Na slici 29, prikazano je konstantno ambijentalno osvjetljenje izračunato standardnim lokalnim modelom (Blinn-Phong), no obogaćeno ambijentalnim sjenama (prva slika), te jednostrukim indirektnim osvjetljenjem (druga slika).
Algoritam korišten za ambijentalne sjene jest prethodno opisani postupak zaklanjanja ambijenta u prostoru slike, s 2D uzorkovanjem (SSAO). Uz relativno jednostavno proširenje ovog postupka, moguće je izračunati i jednostruko odbijeno indirektno osvjetljenje, rezultat čega je prikazan na gornjoj slici. Ovaj prošireni algoritam se naziva globalno osvjetljenje u prostoru slike (eng. screen space global illumination, SSGI). Naziv je pomalo zavaravajući, budući da umjesto punog globalnog osvjetljenja (s efektima poput ispodpovršinskog raspršivanja, kaustike, itd.) zapravo dobivamo samo jednostruko indirektno difuzno osvjetljenje; točniji naziv algoritma bi mogao biti difuzna interrefleksija u prostoru slike. Dakle, ideja je sljedeća - prema jednadžbi iscrtavanja izvedenoj u poglavlju 7, indirektno osvjetljenje u nekoj točki prostora jednako je integralu upadnog zračenja po hemisferi nad tom točkom (uz izostavljanje direktne komponente):
Ovo je veoma slično definiciji ambijentalnog zaklanjanja, koja uključuje integral funkcije vidljivosti po hemisferi. Iz tog razloga, možemo opet aproksimirati rješenje integrala sumacijom uzoraka podintegralne funkcije:
Budući da je riječ o istovjetnom problemu, možemo upotrijebiti isti postupak rješavanja kao kod ambijentalnog zaklanjanja. Jasno, razlika je sada u tome što je umjesto funkcije vidljivosti potrebna funkcija upadne indirektne svjetlosti. Pretpostavimo da je moguće samo jednostruko odbijanje svjetlosti. U tom slučaju, dovoljno je uzorkovati boju difuznog osvjetljenja fragmenata unutar hemisfere (odnosno, u nekoj regiji). Svaki uzorak pridonosi osvijetljenosti danog fragmenta, na temelju svoje boje te udaljenosti od danog fragmenta. Dakle, bit će potrebno definirati i neku funkciju prijenosa između uzoraka, tj. fragmenata. Ova funkcija može biti proizvoljna, ali kao i funkcija zaklanjanja kod SSAO algoritma, mora posjedovati određena svojstva: · Bliži uzorci imaju veći utjecaj nego udaljeniji uzorci. · Funkcija opada u nulu nakon nekog praga.
Također, "udaljenost" uzorka ćemo definirati kao euklidsku udaljenost od danog fragmenta, u prostoru kamere. Preostalo pitanje jest - kako zapravo odrediti boju difuznog osvjetljenja uzoraka? Ukoliko se prisjetimo predložene konfiguracije G-spremnika (slika 9), vidimo da spremnik MRT0 sadrži upravo difuznu komponentu osvjetljenja. Dakle, kao što kod SSAO algoritma uzorkujemo spremnik dubine i evaluiramo funkciju zaklanjanja, kod SSGI algoritma ćemo uzorkovati spremnik difuznog osvjetljenja te evaluirati funkciju prijenosa. Kompletan algoritam glasi ovako: 1. Odaberi 8-32 uzorka u 2D regiji oko danog fragmenta. 2. Odredi vrijednosti difuznog osvjetljenja odabranih uzoraka. 3. Rekonstruiraj pozicije danog fragmenta i odabranih uzoraka u prostoru kamere. 4. Evaluiraj funkciju prijenosa nad dobivenim 3D uzorcima i pripadajućim vrijednostima difuznog osvjetljenja. 5. Pribroji pojedinačne doprinose uzoraka i odredi konačnu osvijetljenost.
Doista, algoritam veoma podsjeća na prethodno opisani postupak ambijentalnog zaklanjanja, te je ova dva algoritma moguće i integrirati, te izvršiti unutar istog prolaza. No, baš kao i kod funkcije zaklanjanja, i funkciju prijenosa je potrebno pažljivo formulirati, budući da predstavlja jezgru samog algoritma. Kao dobro i prikladno rješenje, možemo preuzeti funkciju prijenosa korištenu u već spomenutom DAO algoritmu. Naime, već u [Bunnell 06] razvija se ideja proširenja ambijentalnog zaklanjanja u indirektno osvjetljenje, zbog sličnosti problema. Premda predloženo rješenje djeluje u prostoru scene i time zadržava nedostatke osnovnog DAO algoritma (opisano u prethodnom poglavlju), sama funkcija prijenosa se pokazala korisnom. Dakle, definirat ćemo funkciju prijenosa sljedećim izrazom:
gdje je r vektor koji spaja središta diskova, θO kut između normale odašiljača i vektora r, θP kut između normale primatelja i vektora r, te je A oplošje odašiljača (vidjeti sliku 25). Sljedeće bitno pitanje jest širina regije uzorkovanja. Naime, kod SSAO algoritma, dovoljna je uska regija uzorkovanja, takva da se postigne dobro poklapanje s teksturnim blokovima, i time poveća efikasnost. No, indirektno osvjetljenje emitirano nekim objektom može imati vrlo širok prostor utjecaja, što ovisi o intenzitetu osvijetljenosti tog objekta. Iz tog razloga, potrebno je koristiti širu regiju uzorkovanja, i time obuhvatiti veći broj (potencijalno) utjecajnih uzoraka. U integriranoj implementaciji SSAO i SSGI algoritama, ova potreba rezultira dvojnim načinom uzorkovanja (slično dvoprolaznom klasičnom SSAO pristupu), gdje se usko uzorkovanje koristi za ambijentalno zaklanjanje, a široko uzorkovanje za indirektno osvjetljenje. Kao omjer širina ovih regija, odabran je 1:5. Nažalost, proširenjem regije uzorkovanja, ponovno narušavamo iskoristivost brze lokalne memorije za teksture, što pogoršava performanse. Međutim, postupak je i dalje efikasniji od klasičnog SSAO algoritma s uzorkovanjem u 3D prostoru, kako pokazuje sljedeći graf:
Kao i u prethodnom grafu, performanse su izražene u milisekundama po slici, u ovisnosti o broju uzoraka po fragmentu (mjereno na istoj, prethodno navedenoj testnoj konfiguraciji uz jednake parametre i istu scenu). Ovi rezultati još jednom potvrđuju važnost smanjivanja broja promašenih zahtjeva. Kod 32 uzorka, integrirana SSAO+SSGI implementacija je na granici upotrebljivosti, što znači da bi u stvarnim primjenama bilo poželjno koristiti umanjene G-spremnike, za poboljšanje efikasnosti. Također, proširivanjem regije uzorkovanja, diskretizacijski artefakti postaju donekle uočljiviji, iz jednostavnog razloga što jednakim brojem uzoraka pokrivamo veći prostor (vidjeti prethodno poglavlje, slika 27). Na slici 31, prikazan je detalj sa slike 29, gdje je označen artefakt u obliku tamnog pojasa na dijelu zastave pod utjecajem kugle, koji bi trebao biti jednoliko žute boje, a što je rezultat preskakanja pojaseva fragmenata uslijed poduzorkovanja.
Nažalost, ovaj se problem ne može u potpunosti riješiti bez povećanja broja uzoraka, no moguće ga je ublažiti boljim načinom uzorkovanja (primjerice, spiralno, ili poluslučajno). No, pri konačnom iscrtavanju scene, takvi artefakti neće biti vrlo primjetni (ako uopće), budući da je i sam učinak indirektnog osvjetljenja suptilan. Na kraju, osvrnimo se na ograničenja SSGI algoritma. Jedna od početnih pretpostavki jest ograničenje na tek jednostruko odbijanje svjetla. Budući da je problem višestruke interrefleksije po prirodi rekurzivan, moguće je izračunati doprinose dodatnih odbijanja jednostavnim dodavanjem prolaza istovjetnog algoritma. Međutim, doprinos već i drugog prolaza bi u većini stvarnih scena bio vrlo suptilan, a trećeg prolaza gotovo neprimjetan. S druge strane, vrijeme obrade svakog novog prolaza bi bilo otprilike jednako, što znači da za većinu praktičnih primjena dodatni prolazi ne opravdavaju svoju cijenu. Vrlo značajno ograničenje algoritma proizlazi iz same prirode djelovanja u prostoru slike. Naime, u bilo kojem trenutku, algoritmu su dostupni isključivo podaci o objektima koji su trenutno vidljivi. Međutim, moguća je situacija da poneki objekt i dalje ima utjecaj na vidljivi dio scene, makar sam trenutno nije vidljiv. U tom slučaju, utjecaj tog objekta će biti izgubljen, što nažalost nije moguće izbjeći na elegantan način. Jedno rješenje bi bilo iscrtavanje scene iz nekoliko pogleda, primjerice unutar polukocke. U ovom kontekstu, pod pojmom "polukocka" podrazumijeva se takva kocka, koja je presječena nekom ravninom paralelnom s nekom stranicom te kocke, i to tako da se mreža dobivene polukocke sastoji od jednog kvadrata, te četiri pravokutnika s odnosom stranica 2:1.
Takva polukocka se centrira s obzirom na očište, te se cijela scena iscrta pet puta, za svaku stranicu polukocke, i to tako da normala stranice leži na pravcu gledišta. Jasno, ovime bismo pokrili veći dio prostora nego što je potrebno iscrtati, što bi rezultiralo mnogo većom potrošnjom memorije (zbog povećanja G-spremnika), te mnogo duljim vremenom iscrtavanja (zbog većeg broja fragmenata koje je potrebno obraditi). Iz tog razloga, ograničenje na računanje utjecaja isključivo trenutno vidljivih objekata je u praktičnim implementacijama nažalost neizbježno. Dodatan problem koji se javlja iz istog razloga jest ograničenje na računanje utjecaja samo prednjih poligona. Naime, definirat ćemo prednje poligone kao one koji su okrenuti prema kameri, a stražnje kao one koji su okrenuti u suprotnom smjeru. Dakle, za bilo koji objekt, dovoljno je iscrtati samo prednje poligone, budući da stražnji poligoni ionako nisu vidljivi. Iz tog razloga, u G-spremnicima posjedujemo informacije dobivene isključivo na temelju prednjih poligona. Međutim, jasno je da dani objekt utječe na okolne objekte i svojom stražnjom stranom. Budući da su informacije o stražnjim poligonima izgubljene, nije moguće izračunati njihov doprinos indirektnom osvjetljenju. Jednostavno rješenje ovog problema bi bilo iscrtavanje scene dva puta, i generiranje dva skupa G-spremnika. U prvom prolazu, bili bi obrađeni prednji poligoni, a u drugom stražnji. Rezultat oba prolaza bismo mogli akumulirati u spremniku difuznog osvjetljenja, pomoću aditivnog miješanja. Premda bismo ovime poboljšali točnost i kvalitetu rezultata, udvostručili bismo utrošak memorije te vrijeme izvođenja algoritma. Drugim riječima, ovo postaje pitanje odnosa kvalitete i performansi, što može biti ostavljeno i kao korisnička opcija. U konačnici, SSGI algoritam omogućava na relativno jednostavan način računati indirektno osvjetljenje za dinamičke scene, u stvarnom vremenu. Premda postoje određena ograničenja algoritma, zbog same prirode djelovanja u prostoru slike, algoritam je vrlo efikasan, te nudi dobru aproksimaciju globalnog ambijentalnog osvjetljenja uz vrlo dobre performanse, što ga čini odličnim kandidatom za upotrebu u kompleksnim interaktivnim aplikacijama poput računalnih igara. Daljnja poboljšanja algoritma su direktno vezana uz poboljšanja SSAO algoritma, budući da se oba zasnivaju na istom principu. |