Shadow mapping
Mapiranje sjena učinkovita je metoda soft shadow u stvarnom vremenu. Privukao je veliku pozornost u području stvarne računalne grafike. Sjene se mogu brzo generirati na slučajnim objektima korištenjem uobičajenog algoritma baziranog na Z-bufferu. Ideja temelji na prikazivanju scene iz svjetla. Udaljenost od izvora svjetlosti do najbližih objekata može se dobiti kao z-dubina u Z-bufferu.
Mapiranje sjene ili projekcija sjene je proces kojim se sjene dodaju 3D računalnoj grafici. Ovaj koncept uveo je Lance Williams 1978. u radu pod naslovom "Casting curved shadows on curved surfaces." Od tada se koristi i u unaprijed renderiranim scenama i scenama u stvarnom vremenu u mnogim konzolnim i PC igrama. Sjene se stvaraju testiranjem je li piksel vidljiv iz izvora svjetlosti, uspoređivanjem piksela sa z-bufferom ili dubinskom slikom pogleda izvora svjetlosti, pohranjenom u obliku teksture.
Z-buffer je obično uređen kao dvodimenzionalni niz (x-y) s jednim elementom za svaki piksel
zaslona.
Ako se drugi objekt scene mora prikazati u istom pikselu, grafička kartica uspoređuje dvije dubine i
odabire
onu koja je bliža promatraču. Odabrana dubina se zatim sprema u z-buffer, zamjenjujući stari. Cijeli
sadržaj
koji se nalazi unutar Z-buffera naziva se MAPA SJENE. Zatim, normalno renderiramo scenu iz točke
gledišta.
Za
svaki piksel scene može biti dobro poznat geometrijski položaj objekta.
OBJEKT JE U SJENI Ako je udaljenost između ovog objekta i svjetla veća od udaljenosti pohranjene
u karti sjene.
OBJEKT JE OSVIJETLJEN Inače, ako je udaljenost između ovog objekta i svjetla manja od udaljenosti
pohranjene u karti sjene.
Pregled algoritma
Renderiranje zasjenjene scene uključuje dva glavna koraka crtanja. Prvi proizvodi samu kartu sjene, a drugi je primjenjuje na scenu. Ovisno o implementaciji (i broju svjetala), to može zahtijevati dva ili više prolaza za crtanje.
1. Izrada karte sjene
Prvi korak prikazuje scenu iz svjetlosne točke gledišta. Za točkasti izvor svjetla, pogled bi trebao biti perspektivna projekcija široka koliko je željeni kut učinka (to će biti svojevrsni kvadratni reflektor). Za usmjereno svjetlo (npr. ono od Sunca) treba koristiti ortografsku projekciju. Iz ovog renderiranja ekstrahira se i sprema međuspremnik dubine. Budući da su samo informacije o dubini relevantne, uobičajeno je izbjegavati ažuriranje međuspremnika boja i onemogućiti sve proračune osvjetljenja i teksture za ovo renderiranje, kako bi se uštedjelo vrijeme crtanja. Ova se karta dubine često pohranjuje kao tekstura u grafičkoj memoriji. Ova se karta dubine mora ažurirati svaki put kada dođe do promjena u svjetlu ili objektima u sceni, ali se može ponovno koristiti u drugim situacijama, poput onih u kojima se pomiče samo kamera za gledanje. (Ako postoji više svjetala, mora se koristiti zasebna karta dubine za svako svjetlo.) U mnogim implementacijama praktično je prikazati samo podskup objekata u sceni na karti sjene kako bi se uštedio dio vremena potrebnog za ponovno iscrtavanje karte. Također, pomak dubine koji pomiče objekte od svjetla može se primijeniti na renderiranje karte sjene u pokušaju rješavanja problema sa šivanjem gdje je vrijednost karte dubine bliska dubini površine koja se crta (tj. bacanje sjene površine) u sljedećem koraku. Alternativno, uklanjanje prednjih strana i samo prikazivanje stražnje strane objekata na karti sjene ponekad se koristi za sličan rezultat.
2. Zasjenjenje scene
Drugi korak je crtanje scene iz uobičajene točke gledišta kamere, primjenom karte sjene. Ovaj proces ima
tri glavne komponente:
1. pronalaženje koordinata objekta kako se vidi iz svjetla,
2. test koji uspoređuje tu koordinatu s kartom dubine,
3. objekt se mora nacrtati ili u sjeni ili na svjetlu.
2.1. Koorinate svjetlosnog prostora
Kako bi se točka testirala na karti dubine, njezin položaj u koordinatama scene mora se transformirati u ekvivalentan položaj kako ga vidi svjetlo. To se postiže množenjem matrice. Položaj objekta na zaslonu određen je uobičajenom transformacijom koordinata, ali se mora generirati drugi skup koordinata kako bi se objekt locirao u svjetlosnom prostoru. Matrica koja se koristi za transformaciju svjetskih koordinata u koordinate za gledanje svjetla je ista kao ona koja se koristi za renderiranje karte sjene u prvom koraku (pod OpenGL-om ovo je proizvod matrica prikaza modela i projekcije). To će proizvesti skup homogenih koordinata kojima je potrebna podjela perspektive (vidi 3D projekciju) da postanu normalizirane koordinate uređaja, u kojima svaka komponenta (x, y ili z) pada između −1 i 1 (ako je vidljiva od svjetlosti pogled). Mnoge implementacije (kao što su OpenGL i Direct3D) zahtijevaju dodatno množenje matrice razmjera i pristranosti kako bi se te vrijednosti od -1 do 1 preslikale na 0 do 1, što su uobičajenije koordinate za traženje mape dubine (karte teksture).
Ako se radi s shaderom ili drugim grafičkim hardverskim proširenjem, ova se transformacija obično primjenjuje na razini vrha, a generirana vrijednost se interpolira između ostalih vrhova i prosljeđuje na razinu fragmenta.
2.2. Test karte dubine
Nakon što se pronađu koordinate svjetlo-prostora, vrijednosti x i y obično odgovaraju lokaciji u teksturi karte dubine, a vrijednost z odgovara njenoj pridruženoj dubini, koja se sada može testirati na karti dubine.Ako je vrijednost z veća od vrijednosti pohranjene u karti dubine na odgovarajućem (x,y) mjestu, smatra se da se objekt nalazi iza začepljenog objekta i treba ga označiti kao neuspjeh, da bi ga crtež nacrtao u sjeni postupak. Inače, treba ga nacrtati osvijetljeno. Ako mjesto (x,y) padne izvan mape dubine, programer mora ili odlučiti da površina treba biti osvijetljena ili zasjenjena prema zadanim postavkama (obično osvijetljena). U implementaciji shadera, ovaj test bi se napravio na razini fragmenta. Također, treba biti oprezan pri odabiru vrste pohrane karte teksture koju će hardver koristiti: ako se interpolacija ne može izvršiti, sjena će izgledati kao da ima oštar, nazubljen rub (efekt koji se može smanjiti s većom mapom sjena razlučivost). Moguće je modificirati test karte dubine kako bi se proizvele sjene s mekim rubom korištenjem raspona vrijednosti (na temelju blizine ruba sjene) umjesto da jednostavno prođe ili ne uspije. Tehnika mapiranja sjena također se može modificirati kako bi se nacrtala tekstura na osvijetljenim područjima, simulirajući učinak projektora. Slika iznad s natpisom "vizualizacija karte dubine projicirane na scenu" primjer je takvog procesa.
2.3. Crtanje scene
Crtanje scene sa sjenama može se izvesti na nekoliko različitih načina. Ako su dostupni programibilni shaderi, test karte dubine može se izvesti pomoću fragmentnog shadera koji jednostavno crta objekt u sjeni ili osvijetli ovisno o rezultatu, crtajući scenu u jednom prolazu (nakon početnog ranijeg prolaza za generiranje karte sjene). Ako shaderi nisu dostupni, izvođenje testa karte dubine obično mora biti implementirano nekim hardverskim proširenjem (kao što je GL_ARB_shadow), koje obično ne dopuštaju izbor između dva modela osvjetljenja (osvijetljeni i zasjenjeni) i zahtijevaju više prolaza renderiranja: Renderirajte cijelu scenu u sjeni. Za najčešće modele rasvjete (vidi model refleksije Phong) to bi se tehnički trebalo učiniti koristeći samo ambijentalnu komponentu svjetla, ali to se obično prilagođava tako da uključuje i prigušeno difuzno svjetlo kako bi se spriječilo da zakrivljene površine izgledaju ravno u sjeni. Omogućite test karte dubine i osvijetlite scenu. Područja u kojima test karte dubine ne uspije neće biti prepisana i ostat će zasjenjena. Dodatni prolaz može se koristiti za svako dodatno svjetlo, koristeći miješanje aditiva kako bi se kombinirao njihov učinak s već nacrtanim svjetlima. (Svaki od ovih prolaza zahtijeva dodatni prethodni prolaz za generiranje povezane karte sjene.) Slike primjera u ovom članku koristile su proširenje OpenGL GL_ARB_shadow_ambient za postizanje procesa karte sjene u dva prolaza.
3.Implementacije karte sjena u stvarnom vremenu - NEDOSTACI
Implementacije karte sjene u stvarnom vremenu jedan od ključnih nedostataka mapiranja sjena u stvarnom
vremenu je da veličina i dubina karte sjene
određuju kvalitetu konačnih sjena. Dolazi do pojave nazubljenosti rubova sjena. Neželjeni učinak kod
sjena nazivamo alias. Jednostavan način za prevladavanje ovog ograničenja je povećanje
veličine karte sjene, ali zbog memorijskih, računalnih ili hardverskih ograničenja,
to nije uvijek moguće jer će rezultirati sporijim iscrtavanjem i većom
potrošnjom memorije.
Razvijene su najčešće korištene tehnike za mapiranje sjena u stvarnom vremenu
kako bi se zaobišlo ovo ograničenje: