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.
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, Vec3DV 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., 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 }