Robert Sajko
U poglavlju 6 predstavljene su metode za određivanje direktnih sjena, koje nastaju kao rezultat zaklanjanja direktnog izvora svjetla. Međutim, jedan od učinaka globalnog osvjetljenja, kakvo se javlja u stvarnom svijetu, jest indirektno, ambijentalno osvjetljenje, koje nastaje difuznom interrefleksijom. Dakako, i indirektno osvjetljenje može biti zaklonjeno, pa govorimo o ambijentalnom zaklanjanju, čiji su rezultat suptilne, meke sjene koje naglašavaju primjerice uglove soba, pukotine u objektima, područja dodira dvaju objekata itd. Ovaj je efekt dovoljno suptilan da ga u stvarnom svijetu svjesno ne primjećujemo, no njegov nedostatak kod računalne grafike je primjetan te odaje umjetno generiranu sliku. Kao primjer ovog učinka, dana je slika 18.
Konkretno, implementirani algoritam jest ambijentalno zaklanjanje u prostoru slike (eng. screen space ambient occlusion, SSAO). Ova relativno nova tehnika prvi je puta predstavljena na SIGGRAPH-u 2007. godine, a zanimljivost algoritma jest što se zaklonjenost izračunava isključivo u prostoru slike, slično kao računanje osvjetljenja pri iscrtavanju s odgodom (vidjeti poglavlje 4). U osnovi, ideja ambijentalnog zaklanjanja je jednostavna. Naime, indirektno difuzno osvjetljenje se od svake točke površine objekta širi jednoliko u svim smjerovima, dakle u hemisferi. Prema tome, ambijentalnu zaklonjenost neke točke možemo definirati kao udio površine hemisfere prekriven nekim drugim objektom, kako je prikazano slikom 19.
Formalno, možemo prikazati ambijentalnu zaklonjenost Ap kao integral funkcije vidljivosti Vp,ω po hemisferi Ω:
gdje je, dakako, N normala na površinu, a ω kut integracije. Funkcija vidljivosti jest binarna funkcija čija je vrijednost nula ukoliko je u danoj točki p za dani kut ω vidljiv neki drugi objekt, a jedan inače. Početna ideja SSAO algoritma, kakav je opisan u radovima [Mittring07] i [Filion08], jest numerička aproksimacija integrala danog izrazom (1). Naime, možemo aproksimirati integral sa sumacijom:
Sada je dovoljno uzorkovati funkciju vidljivosti na neki odgovarajući način, te zbrojiti doprinose svih uzoraka. Valja primijetiti kako je ovaj problem moguće riješiti na vrlo elegantan i prirodan način, u okviru postupka praćenja zrake. Naime, funkciju vidljivosti lako odredimo testiranjem presijecanja zrake s objektima na sceni. Za danu točku, ukoliko generirana zraka ne presijeca nikakve druge objekte, izračuna se doprinos ambijentalnog osvjetljenja zrake (primjerice u okviru Blinn-Phong modela). U suprotnom, ukoliko zraka presijeca neki objekt, znači da je promatrana točka zaklonjena, pa se doprinos ambijentalnog osvjetljenja zrake postavlja na nulu. Doprinosi svih zraka generiranih za pojedinu točku se zbroje, i konačni rezultat jest taj da su zaklonjena područja tamnija, a nezaklonjena svjetlija. Nažalost, sam postupak praćenja zrake još uvijek ne pruža zadovoljavajuće performanse za primjenu u kompleksnim, interaktivnim aplikacijama, te je stoga potreban pristup primjereniji rasterizacijskom cjevovodu modernih grafičkih kartica. Jedan takav pristup zasniva se na proširenju tehnike iscrtavanja s odgodom. Naime, kako je objašnjeno u poglavlju 4, kod iscrtavanja s odgodom, u prvom se prolazu samo izvlače potrebni podaci iz geometrijskog opisa scene, i time generiraju G-spremnici. Podaci koji će nas zanimati u okviru SSAO algoritma su normala i dubina po fragmentu, što u predloženoj konfiguraciji (slika 9) odgovara spremniku MRT2. Za izbjegavanje raznih artefakata koji bi mogli nastati uslijed nedovoljne preciznosti spremnika normala i dubina, potrebno je koristiti 32-bitnu preciznost po kanalu, što je još jedan razlog korištenja HDR osvjetljenja (vidjeti poglavlje 5). Međutim, prirodno se postavlja pitanje - kako uzorkovati funkciju vidljivosti u hemisferi nad površinom objekata, ukoliko samo imamo pristup podacima scene u prostoru slike? Zapravo, ono što je potrebno napraviti jest transformirati poziciju fragmenta iz prostora slike u prostor kamere. Istovjetan problem se javlja i kod algoritma preslikavanja sjena, te je njegovo rješenje opisano u poglavlju 6. Sada se već nazire osnovni princip algoritma - za dani fragment, rekonstruirat ćemo poziciju u prostoru kamere, te odabrati određeni broj uzoraka u hemisferi oko te rekonstruirane pozicije. Dakako, još je preostalo pitanje kako točno odrediti funkciju vidljivosti, odnosno, kako utvrditi da li pojedini dobiveni uzorak zaklanja dani fragment. Prihvatljivu aproksimaciju rješenja ovog problema možemo dobiti analizom spremnika dubine. Naime, ukoliko većina uzoraka ima manju dubinu od promatranog fragmenta, to znači da se ti uzorci nalaze bliže promatraču, odnosno, zaključujemo da se dani fragment nalazi u udubini ili pukotini nekog objekta, te stoga očekujemo da je u većoj mjeri zaklonjen nego okolni uzorci. U suprotnom slučaju, možemo očekivati da je promatrani fragment slabo ili nikako zaklonjen. Dakle, jednom kad odaberemo odgovarajući broj uzoraka u prostoru kamere, projicirat ćemo ih natrag u prostor slike, te očitati njihovu dubinu iz spremnika. Zatim, definirat ćemo neku funkciju zaklonjenosti kojom ćemo moći izraziti doprinos pojedinih uzoraka. Ta funkcija može biti proizvoljnog oblika, ali bi trebala zadovoljavati sljedeća svojstva: · Negativne razlike dubina ne pridonose zaklonjenosti. · Manje razlike dubina daju veću zaklonjenost. · Doprinos zaklonjenosti mora pasti na nulu nakon nekog praga. Oblik funkcije s navedenim svojstvima prikazan je slikom 20.
Upravo opisani postupak predstavlja originalni SSAO algoritam. Da rezimiramo, konačni postupak je sljedeći: 1. Rekonstruiraj 3D poziciju fragmenta (u prostoru kamere). 2. Odaberi 8-32 slučajna uzorka u 3D prostoru, u hemisferi oko fragmenta. 3. Projiciraj uzorke natrag u prostor slike. 4. Odredi dubine uzoraka. 5. Izračunaj funkciju zaklonjenosti za pojedine uzorke i pribroji doprinose. Premda je SSAO algoritam konceptualno jednostavan, postoji mnogo detalja o kojima je potrebno voditi računa prilikom implementacije. Primjerice, spomenuto je da je uzorke potrebno odabirati na slučajan način. Naime, ukoliko bismo uzorkovali hemisferu oko danog fragmenta na neki predodređeni način, istovjetno za svaki fragment, došlo bi do pojave prekrivanja uslijed poduzorkovanja (aliasing), te vrlo uočljivih artefakata, kako pokazuje slika 21:
Idealno, bilo bi potrebno za svaki fragment generirati jedinstvene uzorke, bez ikakvog ponavljanja. Za 32 uzorka po fragmentu, uz rezoluciju 1920x1080, bilo bi potrebno generirati ukupno 66355200 različitih 3-komponentnih vektora, što bi uz preciznost od samo 8 bitova po komponenti zahtijevalo otprilike 190 MB. Jasno, ovakav pristup nije primjenjiv za stvarne aplikacije, no postoji drugačiji način. Naime, nastavljajući se na gornji primjer, umjesto generiranja svih 66 milijuna različitih slučajnih vektora, dovoljno je generirati samo 32 (tj. onoliko koliko uzimamo uzoraka po fragmentu), i te vektore prenijeti kao konstante u program za sjenčanje fragmenata. Zatim, potrebno je na neki način pripremiti teksturu šuma, dakle teksturu čiji je svaki slikovni element neke slučajne boje (moguće je upotrijebiti neki grafički alat, ili programski generirati odgovarajuću teksturu). Tekstura šuma treba biti malenih dimenzija, primjerice 64x64 slikovnih elemenata. Trik se zatim sastoji u reflektiranju konstantnog slučajnog vektora od vektora u teksturi šuma, za svaki uzorak, što zapravo rezultira rotacijom uzoraka u slučajnom smjeru. Dakle, rezultat je taj, da vektore uzoraka rotiramo za svaki fragment u nekom slučajnom smjeru, čime se razbija pravilnost u uzorkovanju između fragmenata.
Ovako postavljen algoritam je posebice primjeren implementaciji na grafičkim karticama, budući da je reflektiranje vektora ostvarivo jednim funkcijskim pozivom u programu za sjenčanje. Kao što se vidi na slici 22, slučajnim uzorkovanjem uspjeli smo eliminirati artefakte nastale poduzorkovanjem, no istovremeno smo dodali neugodan šum na sliku. Jedan jednostavan način za ublažavanje šuma temelji se na principu minimalne energije, koji glasi: za zatvoreni sustav s konstantnom entropijom, ukupna energija će biti minimalna u stanju ravnoteže. Kako se ova općenita tvrdnja može primijeniti na naš konkretan problem šuma? Dakle, početnih n slučajnih vektora (gdje je n broj uzoraka po fragmentu) distribuirani su uniformno po sferi, odnosno generiranjem sfernih koordinata s uniformnom distribucijom. Ovaj skup vektora možemo interpretirati kao zatvoreni sustav. Pretpostavimo da je entropija (mjera kaotičnosti) sustava konstantna. Razina šuma u konačnoj slici će biti direktno proporcionalna energiji sustava. Dakle, ono što želimo postići, jest da energija tog sustava bude minimalna, a prema principu minimalne energije, to će se dogoditi u stanju ravnoteže. Kako definirati stanje ravnoteže ovog sustava? Možemo zamisliti sljedeću konstrukciju: traženi vektori zapravo predstavljaju pozicije točaka povezanih oprugama. Prema tome, potrebno je numerički riješiti ovaj sustav. Postupak je jednostavan - za svaki par vektora, odredi se sila opruge. U ravnotežnom stanju, sila mora biti jednaka nuli, te ako je dobivena neka druga vrijednost, pozicija se pomakne za određeni iznos. Kroz određeni broj iteracija (stotinjak), novih pomaka više neće biti, što znači da je pronađeno ravnotežno stanje sustava. Budući da vektore generiramo unutar sfere, njihova je distribucija neovisna o rotaciji (koja će uslijediti prilikom samog uzorkovanja), tako da je ovaj postupak dovoljno provesti samo jednom, primjerice prilikom pokretanja programa, a zatim opet možemo jednostavno prenijeti dobivene vektore kao konstante u program za sjenčanje. Premda princip minimalne energije pomaže pri ublažavanju šuma, taj trik sam po sebi nije dovoljan. Dodatan postupak kojeg možemo provesti zasniva se na ideji zamućivanja. Naime, jasno je da zamućivanjem slike gubimo detalje, što uključuje i šum. Budući da je ambijentalno zaklanjanje općenito nisko-frekvencijska pojava, određeni gubitak detalja je prihvatljiv. Međutim, zamućivanjem bismo "premazali" meke sjene preko površina koje nisu zaklonjene. Prema tome, pitanje je da li je moguće implementirati takav postupak zamućivanja, kojim bismo očuvali oštrima granice između objekata. Odgovor je potvrdan, te leži u tzv. bilateralnom filtriranju. Naime, standardno zamućivanje, primjerice Gaussovim filtrom, jednostavno zamjenjuje vrijednost svakog slikovnog elementa nekom linearnom kombinacijom susjednih elemenata, gdje su pojedini koeficijenti konstantni, tj. ne ovise o vrijednostima slikovnih elemenata. S druge strane, bilateralno filtriranje u obzir uzima i vrijednosti slikovnih elemenata, te kombinira one elemente koji su istovremeno blizu, tj. susjedni (geometrijska lokalnost), te slični bojom (fotometrijska lokalnost). Budući da je ambijentalna komponenta koju pruža SSAO algoritam uglavnom crno-bijela slika sa sivim tonovima, potrebno je samo definirati prag sličnosti, tj. granicu između zaklonjenosti i nezaklonjenosti. Ovaj prag se može ostaviti kao korisnička varijabla, budući da donekle ovisi o karakteristikama specifične scene, a donekle o broju korištenih uzoraka po fragmentu. Konačan rezultat svih opisanih tehnika, koje ćemo nazvati klasičnim SSAO algoritmom, prikazan je slikom 23:
Premda je dobivena slika oku ugodna, performanse su nažalost nezadovoljavajuće. Na testnoj konfiguraciji (Intel Core 2 Duo 2.66 Ghz, ATI Radeon HD3870), iscrtavanje scene na slici 23 traje otprilike 58 milisekundi po slici, što daje 17 slika u sekundi, a što je sasvim neprihvatljivo. U postojećim radovima, spominje se nekoliko pristupa kako poboljšati performanse. Najjednostavniji način jest koristiti smanjenu rezoluciju G-spremnika za potrebe SSAO algoritma, primjerice četvrtinu ili čak osminu rezolucije zaslona. Budući da ionako provodimo zamućivanje, dodatan gubitak detalja neće biti toliko primjetan, pogotovo u konačnoj slici sa osvjetljenjem, teksturama itd. Premda stvaranje dodatnih G-spremnika umanjene rezolucije također zahtjeva određeno vrijeme, dobit zbog znatno bržeg SSAO prolaza opravdava ovaj trošak. Naime, ne samo da je smanjen broj fragmenata koje je potrebno obraditi, već je i poboljšana iskoristivost brze lokalne memorije za teksture (eng. texture cache). Veliki je problem što slučajnim uzorkovanjem u (širokoj) hemisferi oko fragmenta poništavamo korisnost brze lokalne memorije dostupne grafičkim procesorima. Uslijed zahtjeva za čitanjem podatka iz teksture, grafička kartica učitava čitavi blok, te pohranjuje taj blok u brzu lokalnu memoriju. Potencijalni dodatni zahtjevi za čitanjem teksture će po pretpostavci zahvaćati susjedne slikovne elemente, koji će biti sadržani u već učitanom bloku. Za većinu primjena, ova je pretpostavka ispunjena, što donosi značajno ubrzanje. Nažalost, kod klasičnog SSAO algoritma, zbog prirode uzorkovanja, dolazit će do velikog broja promašenih zahtjeva, tj. zahtjeva za podacima koji se nalaze izvan trenutnog teksturnog bloka. Smanjivanjem rezolucije G-spremnika, zapravo postižemo da pojedini blok obuhvaća veću površinu konačne slike (nakon skaliranja na punu veličinu). Budući da uzorkovanje ne vršimo u prostoru slike, već u 3D prostoru - dakle, neovisno o rezoluciji zaslona - dobivamo veću vjerojatnost da će pojedini uzorci nakon projekcije upadati u isti blok, od kojih sada svaki obuhvaća veći udio zaslona. Drugim riječima, u prosjeku ćemo ostvariti manji broj promašenih zahtjeva za čitanjem teksture. Jasno, iz danog objašnjenja je očito da bismo problemu mogli pristupiti i sa suprotne strane - osim povećavanja površine teksturnih blokova, možemo smanjiti radijus hemisfere po kojoj odabiremo uzorke, i na taj način dodatno smanjiti vjerojatnost promašenih zahtjeva. Međutim, širina uzorkovanja također ima znatan utjecaj na konačan izgled ambijentalnog zaklanjanja. Naime, uzak radijus uzorkovanja daje oštrije, tamnije sjene, koje daju jači naglasak pukotinama i oštrim rubovima objekata. S druge strane, širok radijus uzorkovanja daje mekše, svjetlije sjene, te omogućava blagu zaklonjenost i među objektima koji nisu direktno u kontaktu. Konkretno, u prikazanoj implementaciji klasičnog SSAO algoritma (slike 21-23), korišten je dvojni pristup uzorkovanja. Dakle, umjesto jednog skupa slučajnih uzoraka, generiraju se dva skupa, takvih da je prvi skup unutar hemisfere užeg radijusa, a drugi skup unutar hemisfere šireg radijusa. Dakako, sami iznosi tih radijusa ovise o skali scene, no njihov međusobni odnos je neovisan, te se pokazalo da omjer 1:5 daje dobre rezultate. Nažalost, premda se ovime kvaliteta može znatno podići, dodatnim uzorkovanjem u širokom radijusu također se znatno narušavaju performanse, zbog već spomenutog problema promašenih teksturnih zahtjeva. U ovom trenutku, također valja istaknuti dodatnu poteškoću. Naime, kako je već rečeno, uzorke biramo u 3D prostoru te projiciramo u prostor slike, što znači da površina zaslona koju pokriva hemisfera za neki dani fragment može znatno varirati od fragmenta do fragmenta, u ovisnosti o njihovoj dubini. Fragment koji pripada nekom vrlo udaljenom objektu će rezultirati uzorcima koji upadaju u vrlo malenu okolnu površinu, što daje gotovo sto postotnu iskoristivost brze lokalne memorije. S druge strane, hemisfera fragmenta nekog objekta koji se nalazi vrlo blizu kamere će se preslikati u vrlo veliku površinu zaslona, a što znači da će gotovo sigurno svaki uzorak značiti promašeni zahtjev za teksturom, doslovno uništavajući performanse. Iz tog razloga, potrebna je dodatna provjera dubine svakog fragmenta - ukoliko je dubina ispod određenog praga (što, opet, ovisi o skali scene), taj se fragment naprosto odbacuje. Međutim, čak i s postavljanjem praga na dubinu, performanse će donekle varirati pomicanjem kamere po sceni - približavanjem kamere objektima, performanse će opadati, a udaljavanjem će rasti. Konkretno, u razvijenoj implementaciji, performanse u prosjeku variraju od otprilike 10 do 25 slika u sekundi za danu scenu. U konačnici, premda je klasični SSAO algoritam po prvi puta omogućio praktičnu aproksimaciju ambijentalnog zaklanjanja za dinamičke scene u stvarnom vremenu, postoji i niz poteškoća pri njegovoj izvedbi i korištenju: · Potreba za slučajnim uzorkovanjem - stvaranje šuma · Potreba za dodatnim prolazom za filtriranje šuma · Slaba iskoristivost brze lokalne memorije GPU-a · Variranje performansi s promjenom pozicije kamere
Glavni uzročnik svih ovih poteškoća jest nepredvidljivost uzorkovanja. Naime, ne samo da je potrebno odabirati uzorke unutar hemisfere oko fragmenta na slučajan način, već i sama površina zaslona koju ta hemisfera zauzima varira od fragmenta do fragmenta. Prethodno su opisani poneki trikovi kako ublažiti probleme koji nastaju zbog ovakvog uzorkovanja, no pravo rješenje bi bila promjena same prirode uzorkovanja, na način da osiguramo bolju kontrolu i konzistentnost. Prva ideja koje se možemo dosjetiti, jest da se zapitamo da li je uopće potrebno odabirati uzorke u 3D prostoru, budući da ih ionako projiciramo natrag u prostor slike. Drugim riječima, mogli bismo definirati regiju uzorkovanja u prostoru slike, koja bi zauzimala neku odgovarajuću površinu zaslona u okolini promatranog fragmenta. Ovom jednostavnom promjenom bismo naizgled doista dobili ono što smo željeli. Regiju uzorkovanja, u prostoru slike, bismo sada mogli direktno postaviti na željenu veličinu, i time osigurati dobro pokrivanje s teksturnim blokovima, eliminirajući problem promašenih teksturnih zahtjeva. Također, ta regija bi mogla biti konstantne površine, čime bismo riješili problem varirajućih performansi. Međutim, premda ova ideja djeluje obećavajuće, naivnom promjenom prostora uzorkovanja iz 3D hemisfere u 2D regiju nećemo dobiti zadovoljavajuće rezultate. Dobivena slika će izgledati "plošno", bez pravog osjećaja dubine, budući da će algoritam degenerirati u običan 2D filtar. Također, budući da je regija uzorkovanja konstantna, unutar iste regije će biti obuhvaćena veća ili manja površina objekta, u ovisnosti o blizini objekta kameri. Kao rezultat, približavanjem ili udaljavanjem kamere, sjene će postajati svjetlije ili tamnije. Jasno, mogli bismo riješiti ovaj problem tako da prilagodimo veličinu regije uzorkovanja dubini fragmenta, no time bismo samo došli do neke refaktorirane verzije klasičnog SSAO algoritma. Postoje pristupi poput [Bavoil, Sanz 08], gdje se sama hemisfera projicira u prostor slike, i time dobije varijabilna regija uzorkovanja u obliku diska. Premda i ovakav pristup pruža određena poboljšanja, kako je pokazano u navedenom radu, glavni problemi originalnog algoritma su i dalje prisutni, te performanse i dalje nisu sasvim zadovoljavajuće. Dakle, potrebna je neka nova spoznaja koja bi dovela do pravog pomaka. Ključ te spoznaje je već natuknut rečenicom: "algoritam degenerira u običan 2D filtar". Doista, glavni problem je što je funkcija zaklonjenosti, koja predstavlja jezgru samog algoritma, u osnovi jednodimenzionalna, budući da je definirana isključivo nad dubinom. No, budući da samo uzorkovanje vršimo u 3D prostoru, to znači da je informacija o 3D poziciji implicitno sadržana u odabiru uzoraka nad kojima evaluiramo funkciju zaklanjanja. Upravo ova činjenica omogućava da klasični SSAO algoritam, koji evaluira 1D funkciju u prostoru slike, ipak daje osjećaj dubine i prostora, za razliku od običnog 2D filtra. Uzorkovanjem u 2D regiji gubimo implicitnu informaciju o poziciji u prostoru kamere, što znači da ju moramo eksplicitno izračunati, te redefinirati funkciju zaklanjanja tako da djeluje nad vektorom pozicije, umjesto nad samo dubinom. Drugim riječima, algoritam sada glasi ovako: 1. Odaberi 8-32 uzorka u 2D regiji oko danog fragmenta. 2. Rekonstruiraj pozicije danog fragmenta i odabranih uzoraka u prostoru kamere. 3. Evaluiraj funkciju zaklanjanja nad dobivenim 3D uzorcima. 4. Pribroji pojedinačne doprinose uzoraka i odredi konačnu zaklonjenost.
Za početak, jednostavnosti radi, neka uzorkovanje bude predodređeno i jednako za svaki fragment, odnosno, unutar neke pravilne rešetke. Glavno pitanje na koje sada treba pronaći odgovor jest kako definirati funkciju zaklanjanja. Općenita svojstva i oblik te funkcije trebaju ostati jednaki već opisanima, no s tom promjenom da umjesto razlike dubina, promatramo primjerice euklidsku udaljenost uzoraka. Kao dobar izbor funkcije zaklanjanja, pokazala se metoda korištena u algoritmu dinamičkog zaklanjanja ambijenta (eng. dynamic ambient occlusion, DAO) [Bunnell 06]. Detaljan pregled ovog algoritma dan je u [Sajko 08], te ćemo ovdje dati samo kratak uvid u osnove. Dakle, ideja je vrlo slična kao kod klasičnog SSAO algoritma, no postupak se provodi u prostoru scene, te ne zahtjeva generiranje G-spremnika. Umjesto toga, potrebno je generirati dodatnu strukturu podataka na temelju geometrije scene, u kojoj će svaki vrh biti predstavljen diskom. Svaki takav disk treba biti orijentiran u prostoru tako da je okomit na normalu u danom vrhu. Primjer prikaza nekog objekta ovom strukturom dan je slikom 24:
Jednom kad je odgovarajuća struktura diskova izgrađena, moguće je za svaki disk testirati vidljivost svih ostalih diskova, te evaluirati mjeru zaklonjenosti promatranog diska. Dakako, dobivene se vrijednosti zatim mogu jednostavno upotrijebiti pri izračunu ambijentalnog osvjetljenja po vrhu. Premda opisani algoritam ima značajne nedostatke (računanje zaklonjenosti po vrhu umjesto po fragmentu, potreba za dodatnom obradom scene), ono što je zanimljivo jest sama funkcija zaklanjanja. Naime, po definiciji, ambijentalna zaklonjenost neke točke jest udio površine hemisfere nad tom točkom, koji je zaklonjen nekim drugim objektom. Neka se objekt koji biva zaklonjen naziva primatelj, a objekt koji zaklanja odašiljač. Ukoliko pretpostavimo da su i primatelj i odašiljač u obliku diska (projekcija hemisfere na ravnu plohu), onda se pokazalo da dobru aproksimaciju mjere zaklonjenosti daje sljedeća formula:
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. Funkcija max() vraća veći od dvaju argumenata, a služi zato da ograničimo računanje zaklonjenosti samo za objekte iznad gornje hemisfere. Navedene veličine grafički su prikazane slikom 25:
Vidimo da ovako definirana funkcija ovisi o međusobnom položaju uzoraka u 3D prostoru, a ne o njihovoj dubini - čime upravo zadovoljava svojstva potrebna za upotrebu u SSAO algoritmu uz 2D uzorkovanje. Direktnom ugradnjom navedene funkcije zaklanjanja u SSAO algoritam, zapravo implicitno aproksimiramo površinu objekata skupom diskova, baš kao što to eksplicitno čini DAO algoritam. Iz tog razloga, uslijed poduzorkovanja možemo očekivati pojavu artefakata u obliku pojaseva diskretnih razina intenziteta sjena, umjesto glatkih, kontinuiranih polusjena. No, budući da su takvi artefakti također oblik aliasinga, moći ćemo primijeniti već razmotrenu tehniku slučajnog uzorkovanja.
Međutim, pokazalo se da su dobiveni rezultati čak iznad očekivanja. Na slici 26, prikazana je istovjetna scena kao u prethodnim primjerima, no iscrtana SSAO algoritmom uz pravilno, predodređeno uzorkovanje u 2D regiji oko fragmenata. Sam oblik ove regije nije presudan, no možda je najprirodnije pretpostaviti oblik diska. Redoslijed odabira uzoraka može biti u obliku koncentričnih kružnica, spirale ili slično. Pozicije traženih uzoraka, odnosno, oblik same regije uzorkovanja je najpraktičnije prikazati parametarskom jednadžbom, koju je moguće jednostavno evaluirati kroz niz iteracija. Jedan jednostavan i prikladan pristup prikazan je sljedećim grafom (slika generirana Wolfram Mathematica programskim paketom), gdje parametar a definira širinu regije uzorkovanja (slika 27).
Premda su na slici 26 prisutni očekivani artefakti, najuočljivije kod kružnih stuba u donjem dijelu slike, pojavljuju se u drastično manjoj mjeri nego kod klasičnog SSAO algoritma, uz jednak broj uzoraka po fragmentu. Razlog tomu djelom leži u samoj promjeni prostora uzorkovanja, a djelom u smanjenoj širini regije uzorkovanja. Kao što se vidi usporedbom slika 23 i 26, izgubljene su prostrane meke sjene dobivene širokim uzorkovanjem, a zadržani su samo naglasci oštrih prijelaza u reljefu scene. Premda je moguće proširiti regiju uzorkovanja, time bismo ponovno narušili iskoristivost brze lokalne memorije, pa je potrebno odvagnuti širinu pretraživanja i performanse. Također, budući da je pravilno uzorkovanje u uskoj 2D regiji vrlo pogodno arhitekturi modernih grafičkih kartica, možemo lako povećati broj uzoraka na primjerice 64 ili čak 128 po fragmentu, a i dalje zadržati sasvim prihvatljive performanse. Kod ovako visokog broja uzoraka, problem poduzorkovanja u potpunosti nestaje, premda i sa standardnih 32 uzorka, artefakti poduzorkovanja su slabo primjetni. Iz ovoga slijedi da slučajno uzorkovanje nije niti potrebno, što znači da neugodan, primjetan šum zamjenjujemo slabo primjetnim diskretizacijskim artefaktima. Nadalje, više nije potreban niti dodatan prolaz zamućivanja, čime se postupak implementacije te računalna zahtjevnost dodatno pojednostavljuju. Sljedeći graf pokazuje ovisnost performansi o broju uzoraka, za klasični SSAO, te za SSAO s 2D uzorkovanjem. Mjera performansi jest vrijeme utrošeno po slici (u milisekundama), uz konstantnu rezoluciju (1280x720) i punu veličinu G-spremnika, mjereno na konfiguraciji: Intel Core 2 Duo 2.66 Ghz, ATI Radeon HD3870.
Ovime smo pokazali kako, uz relativno jednostavne izmjene, SSAO algoritam može poprimiti znatno bolja svojstva. Redefinicijom funkcije zaklanjanja, omogućeno je jednostavno uzorkovanje u prostoru slike, umjesto dosadašnjeg uzorkovanja u 3D prostoru. Time je algoritam postao jednostavniji za implementaciju, te mnogo prikladniji arhitekturi modernih grafičkih kartica. Kroz bolju iskoristivost brze lokalne memorije, značajno su poboljšane performanse, koje su također mnogo konzistentnije. Daljnji razvoj algoritma je moguć u obliku pronalaska jednostavnije funkcije zaklanjanja, čime bi se smanjilo vrijeme obrade pojedinačnih uzoraka, ili boljeg načina uzorkovanja (primjerice, uzimanje varijabilnog broja uzoraka, u ovisnosti o dubini, ili neki poluslučajni pristup), čime bi se u prosjeku smanjio broj potrebnih uzoraka za postizanje iste kvalitete. |