Primjer
Na stranici za preuzimanje nalazi se dostupan čitav kod primjera, eventualno potrebne dodatne datoteke te upute.
Detaljnije objašnjenje koda nalazi se na stranici s objašnjenjima.
Nakon pokretanja koda iz primjera, odnosno nakon pokretanja izvršne datoteke dobivene iz koda, pojavljuje se početno stanje kao na slici.
Ukoliko se primjer pokrene više od jednom, može se primijetiti kako su objekti drugačije raspoređeni. To je zato što čovječuljak, svjetlo i podloga imaju uvijek jednake početne pozicije, dok su ostali objekti raspoređeni slučajnim odabirom, sa slučajnim veličinama i slučajnim bojama.
Kako bi primjer imao smisla, nužno je imati mogućnost interakcije. Kako koja kontrola točno funkcionira bit će prikazano kroz primjer, no evo i popisa da sve bude na jednom mjestu:
- strelice lijevo/desno/gore/dolje - kretanje čovječuljka
- +/- - dizanje/spuštanje glave čovječuljka
- k/K - smanjivanje/povećavanje veličine čovječuljka
- q/Q, w/W, e/E - kretanje kamere po x, y i z osi
- a/A, s/S, d/D - kretanje izvora svjetlosti po x, y i z osi
- r/R, t/T, z/Z - pomicanje središnje točke pogleda po x, y i z osi
- L/l - premještanje kamere na poziciju izvora svjetosti / vraćanje na prethodni položaj
- y/Y - isključivanje/uključivanje ispravljanja akni sjena selektivnim odbacivanjem
- x/X - isključivanje/uključivanje ispravljanja akni sjena omogućavanjem odstupanja kod iscrtavanja poligona
- Esc - izlaz
Kretanje čovječuljka u ovom virtualnom svijetu izvodi se pomoću strelica. Kako se nalazi u različitim položajima naspram izvora svjetlosti, tako je moguće uočiti i promjene u sjeni koju baca na okolinu.
Pritiskom na + ili - čovječuljak diže ili spušta glavu, odnosno izdužuje mu se ili skraćuje vrat. Može se primijetiti da kad se glava digne gotovo na visinu na kojoj se nalazi izvor svjetlosti, njena sjena se povećava.
Pomoću tipki k i K, čovječuljak može mijenjati svoju veličinu. U primjeru na slici poprilično je porastao.
Tipkama q/Q, w/W te e/E pomiče se kamera. Moguće je premjestiti ju na bilo koju poziciju, kako bi se dobio bolji pogled iz drugog kuta.
Osim kamere, tipkama a/A, s/S, d/D može se pomaknuti i izvor svjetlosti. Tipkom a/A izvor se spušta ili diže, dok preostale dvije kontrole pomiču svjetlo u ravnini po kojoj se čovječuljak kreće. Moguće je pomicati i središnju točku u koju je pogled uperen, odnosno fokus svjetla i kamere, pomoću tipki r/R, t/T, z/Z.
Pritiskom na L iz običnog se pogleda prelazi u pogled s pozicije izvora svjetla. Pritiskom na l vraća se u prethodni pogled.
Ovdje svakako treba zastati i objasniti važnost pogleda iz pozicije svjetla. Pažljivije oko uočit će kako u tom pogledu nema sjena. Gledano s tog položaja, jasno je da će sve biti osvijetljeno, jer sjena zapravo i nastaje tamo gdje svjetlost ne dopire. U stvarnom je svijetu to samo po sebi razumljivo i očekivano. Kod računalne grafike to ipak nije trivijalan problem.
Ovaj primjer riješen je metodom mapa sjena. Tom se metodom svi objekti crtaju (ili bolje rečeno, računaju) dva ili tri puta - prvi put upravo iz pogleda izvora svjetla, kako bi se dobile točne koordinate svih objekata u vidokrugu svjetla. Taj se pogled ne iscrtava, već se samo sve dobivene točke pamte. Drugi prolaz kroz računanje objekata ponekad se ni ne izvodi, ovisno o verzji Open GL-a. Taj se prolaz iscrtava, a riječ je o pogledu iz pozicije kamere sa vrlo tamnom difuznom i ambijentalnom svijetlošću, preko kojeg će se kasnije crtati osvijetljeni pogled, ali samo tamo gdje nema sjena. Ono što se time dobiva jest da sjene nisu potpuno crne, već imaju neku laganu svjetlost, kao i u stvarnom svijetu. U novijim verzijama Open GL-a taj korak ipak nije potreban. Treće (ili drugo) i konačno iscrtavanje vrši se s osvijetljenim pogledom iz pozicije kamere. Prije toga, međutim, potrebno je transformirati matrice izračunate iz pogleda svjetla i mapirati ih izravno na teksturu. Nakon što se vrijednosti koje su na ovakakav način zapamćene u spremniku dubine usporede s osvijetljenim pogledom, znat će se je li neku točku potrebno iscrtati ili ne. Ako se iscrtava, tada će u krajnjem rezultatu biti osvjetljena, a u suprotnom će se na njenom položaju nalaziti zatamnjeni prikaz iz drugog prolaza, tj. sjena (ili će se jednostavno dobiti lijepa sjena bez tog prolaza u novijim verzijama Open GL-a).
Problemi
Treba spomenuti kako ova tehnika nipošto nije savršena, već pati od nekih nedostataka.
Jedan od najuočljivijih nedostataka vidljiv je kad se pritisnu y i x, nakon čega se pojavljuju akne sjena.
Problem nastaje zbog toga što svjetlost pada pod kutom, pa neki dijelovi ostanu na kraju pogrešno u sjeni. Jedan od načina na koji se to rješava jest selektivno odbacivanje prednje plohe prilikom generiranja koordinata za spremnik dubine gledano iz pozicije svjetla. Time se problem s prednjih ploha koje bi trebale biti osvjetljene prebacuje na stražnje plohe koje ionako nisu osvjetljene.
Na gornjoj slici vidljiv je rezultat primjene metode selektivnog odbacivanja na primjeru. Vrlo je lako uočiti veliko poboljšanje, iako rezultat još uvijek ima nekih mana. Donja slika prikazuje rezultat korištenja druge metode, a to je uvođenje odstupanja pri iscrtavanju poligona. Na taj način radi se odmak od mjesta nastanka problema i ono što se dobije time ne djeluje loše, ali tu se javlja problem zakrivljenih površina kod kojih odstupanje upravo zbog zakrivljenosti ne funkcionira najbolje.
Nekako najbolje djeluje sve skupa kada se uključe i jedna i druga metoda rješavanja problema akni sjena. Međutim, treba naglasiti kako ni to nije savršeno rješenje, jer zbog odstupanja nastaje svjetla traka ispod valjka koja bi trebala biti u sjeni. Rješenje leži u pronalasku pravih koeficijenata odstupanja.
Drugi problem koji se pojavljuje uočljiv je ukoliko se čovječuljak pomakne dovoljno daleko ili ako se promatraju objekti prema kojima je čovječuljak na slici okrenut.
Razlog problema lako je uočljiv ukoliko se tipkom L prebaci u pogled svjetla. Radi se o vidnom polju izvora svjetla, koje je vrlo ograničeno. Rješenja zapravo i nema. Jedino što se može jest povećati vidno polje i pomaknuti svjetlo na poziciju na kojoj će pokriti sve što se događa u granicama u kojima je moguće vidjeti kreirani svijet. Krene li se izvan granica, problem će se opet pojaviti, jer ova metoda ne može imati neograničeno vidno polje.
Treći problem karakterističan za tehniku mapa sjena jesu oštrina prijelaza i pikselizacija. Nisu razdvojeni kao problem, jer se mogu u neku ruku na zajednički način pokušati riješiti. O oštrini prijelaza na prvi se pogled ne razmišlja, no kad se malo bolje promotri situacija, u stvarnom svijetu rijetko dolazi do tako oštrog prijelaza između svjetla i sjene. Pikselizacija pak je lako uočljiva, nijedno se tijelo ne može iscrtati savršeno glatko, a svaki će piksel na tjelu značiti i nesavršenost u sjeni, naročito u položajima kada je sjena veća od samog objekta. Problem se rješava interpolacijom i Poissonovom radiobom, odnosno uzorkovanjem. Kako često ni to ne daje zadovoljavajuće rezultate, prelazi se na višeslojno uzimanje uzoraka, no jasno je da tako nešto kao posljedicu ima i značajan pad performansi.