next up previous contents
Next: 4.3 Geometrija presekov zarka Up: 4.2 Osnovni rekurzivni algoritem Previous: 4.2.2 Odbiti in prepusceni Vsebina: contents

4.2.3 Whittedov algoritem

Izvedba splosnega sledenja zarku je zahtevna zaradi velikega stevila izracunov presekov, kot tudi mnozice moznih sekundarnih zarkov s katerimi katerih lahko prihaja osvetlitev. Na sliki 4.5 je prikazan primarni zarek , ki na prvi presecni povrsini generira odbiti zarek in prepusceni zarek . V tocki preseka se doloci tudi direktna osvetlitev v smeri .

Whittedov pristop dolocanja indirektne osvetlitve uposteva samo zarke v smeri in . Ce je povrsina odbojna, se generira sekundarni zarek v smeri tolikokrat, kolikorkrat je podrebno, da je prispevek k osvetlitvi primarnega zarka se bistven ali ce je dosezeno predpisano stevilo zrcalnih odbojev. Podobno velja za prozorne povrsine. Na sliki 4.5 so vse krogle delno prozorne in odbojne. V splosnem vsak sekundarni zarek generira tri zarke, od katerih sta dva rekurzivna.

 

 

Slika 4.5: Potovanje zarka . Na vsaki presecni povrsini se generirajo odbiti , prepusceni in sencni zarki

Poenostavljen osvetlitveni model v vsaki presecni tocki, na osnovi Hallovega modela, lahko zapisemo kot:

kjer je prvi izraz lokalna osvetlitev, drugi izraz direktna osvetlitev. Zadnja dva izraza sta globalna osvetlitev, ki jo prispevata zrcalni in prepusceni zarek.

Dolocitev globalne osvetlitve se algoritmicno ne razlikuje od dolocitve osvetlitve za primarne zarke, kar poenostavi izvedbo programa z rekurzivno naravo dolocanja globalne osvetlitve. Primarne zarke generiramo po sledecem algoritmu:

  proc  Screen(Comp *scene, *Camera *view, 
              Display *display, Color *pic)

¯ begin\

{ doloci meje rastrskega pomnilnika in koren vseh objektov }

for ¯ y := to do ¯

for ¯ x := to do ¯

{ izracunaj smer primarnega zarka , ki gre skozi

zaslonsko tocko }

Trace(0, , , barva);

{ shrani barvo v rastrski pomnilnik *pic }

od

od

end

Algoritem sledenja zarkov Trace je isti za vse primarne in sekundarne zarke. Je rekurziven z omejitvijo globine. Nekatere implementacije delijo Trace na dva podprograma. Prvi sledi zarku in isce presecisca z objekti, drugi pa skrbi za izracun osvetlitve v najblizjem preseciscu.  

  proc  Trace(int globina, Vec3D , Vec3D ,
               Barva *barva)

begin\

if globina > maxglobina then\

barva := crna

else\

begin\

¯ { poisci najblizje presecisce za podani zarek in }

if presecisce obstaja then\

begin\

¯ { doloci normalo v preseciscu }

{ izracunaj lokalno osvetlitev }

{ doloci sencne zarke in direktno osvetlitev }

{ izracunaj smer zrcalnega odboja }

Trace(globina+1, presecisce, , zrcalna-barva)

{ izracunaj smer prepuscenega zarka }

Trace(globina+1, presecisce, , prepuscena-barva)

{ zdruzi barvo lokalne osvetlitve, direktne osvetlitve, zrcalno barvo

in prepusceno barvo z upostevanjem lastnosti povrsine }

end

end

end { Trace }

V prikazanem algoritmu se lahko uvede dodatna optimizacija, ki preverja smiselnost generiranja zrcalno odbitih zarkov glede na prispevek, ki je odvisen od odbojnosti povrsine. Podobna optimizacija je mozna tudi pri kontroli prozornosti povrsine. Pri obeh testih se primerja prispevek osvetlitve s sekundarnim zarkom z neko predpisano minimalno vrednostjo, ki je se smiselna za rekurzivno generiranje novih zarkov.



Copyright © 1995 Leon Kos, Univerza v Ljubljani