Poglavlje 10: Osvetljenje -- Teorija

Poglavlje 10: Osvetljenje -- Teorija

U ovom poglavlju razumeš šta je svetlost, kako se meri, kako interaguje sa površinama, i kako se sva ta fizika prevodi u jednačine koje renderer koristi da izračuna boju svakog piksela. Ovo je teorijski temelj na kome počivaju PBR materijali, global illumination, i svaka tehnika osvetljenja u Unreal Engine 5. Bez ovog znanja, sve što sledi je crna kutija.


Zašto ovo poglavlje postoji

Razmisli o sledećem: kad pogledaš sobu u kojoj sediš, svaki objekat koji vidiš -- sto, zid, šolja kafe -- vidiš samo zato što svetlost pada na njega, odbija se od njegove površine, i ulazi u tvoje oči. Bez svetlosti, ne vidiš ništa. Bukvalno ništa. Potpuni mrak.

Sad pomisli koliko je taj proces komplikovan. Sunce emituje svetlost. Ta svetlost prolazi kroz atmosferu, ulazi kroz prozor, pogađa zid. Deo se apsorbuje, deo se odbija u raznim pravcima. Odbijena svetlost pogađa pod. Deo se opet odbija i osvetljava donju stranu stola, dajući mu onu meku, toplu boju. Deo završava u tvojim očima. A tvoj mozak iz tog haosa fotonskih informacija rekonstruiše koherentnu 3D sliku sveta.

Kad renderuješ scenu u Unreal Engine 5, pokušavaš da simuliraš sve to -- ali u 16 milisekundi ili manje, za svaki frejm. Da bi to bilo moguće, moraš da razumeš fiziku svetlosti dovoljno duboko da znaš šta možeš da aproksimiraš, šta smeš da zanemariš, i šta apsolutno moraš da izračunaš da bi slika bila uverljiva.

Ovo poglavlje je teorijski temelj. U poglavlju 11 ćemo primeniti ovu teoriju na PBR materijale. U poglavlju 12 ćemo videti kako global illumination aproksimira indirektno osvetljenje. Ali sve počinje ovde -- sa razumevanjem šta je svetlost, kako se meri, kako interaguje sa materijom, i kako se to sve opisuje matematički.

Hajde da krenemo od samog početka.


10.1 Svetlost -- kratki fizički kontekst

Elektromagnetni spektar

Svetlost je elektromagnetno zračenje. To je fundamentalna činjenica na kojoj počiva sve u ovom poglavlju.

Elektromagnetno zračenje obuhvata ogroman raspon -- od radio talasa sa talasnim dužinama od nekoliko metara, preko mikrotalasa, infracrvenog, vidljive svetlosti, ultraljubičastog, X-zraka, sve do gama zraka sa talasnim dužinama manjim od atoma. Svo ovo zračenje se ponaša po istim fizičkim zakonima -- putuje brzinom svetlosti, ima i talasnu i čestičnu prirodu -- ali naše oči mogu da detektuju samo jedan uzak pojas.

Vidljiva svetlost zauzima talasne dužine od otprilike 380 nm do 780 nm (nanometara). To je neverovatno mali deo celokupnog elektromagnetnog spektra -- kao da na klaviru koji ima milion dirki možeš da čuješ samo jednu oktavu. Ali ta oktava je sve što imaš, i ceo vizuelni svet je konstruisan iz nje.

Elektromagnetni spektar (uprošćeno):

Radio talasi    Mikrotalasi    Infracrveno  ║  VIDLJIVA  ║  UV      X-zraci    Gama
                                            ║  SVETLOST  ║
  m ────── cm ────── μm ──────────────────── nm ──────────────── pm ────── fm
                                            ║380nm—780nm ║
                                            ╚════════════╝
                                              ↑ Ovo je sve
                                                što vidiš

Talasna dužina i boja

Unutar tog uskog pojasa vidljive svetlosti, različite talasne dužine percepirate kao različite boje:

Talasna dužina (nm) Boja
380 -- 450 Ljubičasta
450 -- 495 Plava
495 -- 570 Zelena
570 -- 590 Žuta
590 -- 620 Narandžasta
620 -- 780 Crvena

Evo analogije koju volim: zamisli da su talasne dužine svetlosti kao note na klaviru. Kratke talasne dužine (ljubičasta) su visoki tonovi, duge talasne dužine (crvena) su niski tonovi. Baš kao što možeš da sviraš akord kombinujući više nota, svetlost koju vidiš je obično mešavina mnogo različitih talasnih dužina istovremeno. Bela svetlost sunca sadrži sve talasne dužine -- to je kao da pritisneš sve dirke u "vidljivoj oktavi" odjednom.

Kad svetlost pogodi objekat, neke talasne dužine se apsorbuju (objekat ih "guta"), a neke se odbijaju. Crvena jabuka apsorbuje većinu talasnih dužina osim onih oko 620-780 nm, koje odbija nazad ka tvojim očima -- i tvoj mozak to interpretira kao "crveno". Zeleni list apsorbuje crvenu i plavu, a odbija zelenu. Crni objekat apsorbuje skoro sve. Beli objekat odbija skoro sve.

Ovo je suštinski mehanizam pojave boja u svetu oko nas -- i upravo ono što renderovanje pokušava da simulira.

Kako ljudsko oko perceipira svetlost

Tvoje oko nije naučni instrument. Ono je biološki senzor sa specifičnim (i prilično čudnim) karakteristikama, i razumevanje tih karakteristika je bitno za rendering jer -- krajnji sudija kvaliteta slike nije fizika, nego tvoje oko i mozak.

Na retini imaš dve vrste fotoreceptora:

Štapići (rods) -- oko 120 miliona komada. Izuzetno osetljivi na svetlost, ali ne razlikuju boje. Ovi su zaduženi za vid u mraku (skotopski vid). Kad uđeš u zamračenu sobu i posle par minuta počneš nešto da vidiš, to su štapići koji su se adaptirali.

Čepići (cones) -- oko 6-7 miliona komada. Manje osetljivi, ali razlikuju boje. Postoje tri tipa, svaki osetljiv na različit opseg talasnih dužina:

Ovo je razlog zašto koristimo RGB model boja u renderovanju. Tri kanala (Red, Green, Blue) odgovaraju trima tipovima čepića u oku. Naravno, ovo je aproksimacija -- ljudski kolorni vid je znatno komplikovaniji -- ali je aproksimacija koja radi dovoljno dobro za prikaz na ekranu.

Bitna posledica za rendering: tvoje oko ne vidi talasne dužine -- ono vidi relativnu stimulaciju tri tipa čepića. Dve fizički potpuno različite svetlosti (sa potpuno različitim spektralnim distribucijama) mogu da izgledaju identično za tvoje oko, sve dok stimulišu tri tipa čepića u istom odnosu. Ovo se zove metamerizam, i to je razlog zašto RGB rendering uopšte funkcioniše. Ne moramo da simuliramo svaku talasnu dužinu -- dovoljno je da pogodimo tri broja (R, G, B) tako da ekran stimuliše tvoje čepiće na isti način kao što bi to uradila prava svetlost.

Za većinu rendering situacija, ovo je sasvim dovoljno. Ali postoje rubni slučajevi -- rainbow efekti, disperzija svetlosti kroz prizmu, fluorescentni materijali -- gde RGB aproksimacija zakazuje i gde bi ti trebalo spectral rendering (renderovanje sa punim spektrom talasnih dužina). UE5 standardno koristi RGB, ali svest o ovom ograničenju je korisna.

Dualna priroda svetlosti

Za potrebe renderovanja moraš da znaš da svetlost ima dualnu prirodu:

U klasičnom real-time renderovanju skoro isključivo koristimo model geometrijske optike -- tretirajmo svetlost kao zrake koji putuju u pravoj liniji, odbijaju se od površina, i prelamaju se na granicama medijuma. Ovo ignoriše talasne fenomene poput difrakcije i interferencije, ali je dovoljno tačno za ogromnu većinu vizuelnih situacija na makro nivou.

Ray tracing -- koji UE5 podržava kroz Lumen i hardverski ray tracing -- je bukvalno implementacija ovog modela: praćenje zraka svetlosti kroz scenu. O tome detaljno u poglavlju 12.


10.2 Radiometrija i fotometrija

Sad kad razumemo šta je svetlost, moramo da je znamo meriti. I tu se stvari komplikuju, jer postoje dva potpuno različita sistema za merenje svetlosti -- i oba su relevantna za rendering.

Zašto dva sistema?

Zamisli ovu situaciju: imaš dve sijalice. Prva emituje 100 vati elektromagnetnog zračenja, većinom u infracrvenom (toplotno zračenje). Druga emituje 10 vati, ali skoro potpuno u vidljivom spektru.

Sa stanovišta fizike (radiometrija), prva sijalica je 10 puta "jača". Ali sa stanovišta tvog oka, druga je mnogo svetlija -- jer tvoje oko uopšte ne reaguje na infracrvenu svetlost. Sav taj infracrveni wattage je "nevidljiv".

Zato postoje dva sistema:

Oba sistema su bitna za rendering. Radiometrija je ono što fizika "zapravo radi" -- jednačina renderovanja je radiometrijska. Fotometrija je ono što koristimo u praksi za definisanje svetala, jer na kraju krajeva pravimo sliku za ljudsko oko, ne za fizički detektor.

Radiometrija -- fizika svetlosti

Radiometrija opisuje elektromagnetno zračenje čisto fizički, u vatima (watts). Evo ključnih veličina, od najjednostavnijih ka složenijim:

Radiant Energy (Q) -- Zračena energija

Ukupna količina energije elektromagnetnog zračenja, merena u džulima (J).

Ovo je najosnovnija veličina. Jedan foton nosi energiju E = hf (gde je h Plankova konstanta, f frekvencija). Milioni fotona = više energije. Ova veličina sama po sebi se retko koristi u renderovanju, ali je temelj za sve ostale.

Radiant Flux / Radiant Power (Φ) -- Zračeni fluks

Energija po jedinici vremena, merena u vatima (W) (1 W = 1 J/s).

Ovo je snaga izvora svetlosti. Sijalica od 60 W emituje 60 džula energije svake sekunde (ali većina toga je toplota, ne vidljiva svetlost -- zato klasične sijalice nisu efikasne).

Analogija: Zamisli česmu iz koje teče voda. Radiant energy je ukupna količina vode koja je protekla. Radiant flux je protok -- koliko litara u sekundi. Snažnija česma = veći fluks.

Irradiance (E) -- Ozračenost

Fluks po jedinici površine koja prima svetlost, merena u W/m² (vati po kvadratnom metru).

Ovo meri koliko svetlosti pada na neku površinu. Ako imaš jednu sijalicu u sobi, zid blizu sijalice prima više irradiance nego zid koji je daleko -- jer ista količina svetlosti se "rasipa" po većoj površini na većoj udaljenosti.

Analogija sa kišom: Irradiance je kao količina kiše koja pada na kvadratni metar tla. Ako kiša pada ravnomerno, svaki kvadratni metar prima istu količinu. Ali ako držiš kišobran pod uglom, manja površina kišobrana "hvata" kišu -- efektivna površina se menja u zavisnosti od ugla. Upravo zato imamo kosinusni faktor u jednačini renderovanja (objašnjenje sledi).

Ekvivalent za izvor svetlosti (koliko fluks napušta površinu) zove se Radiant Exitance (M), isto W/m², ali za emitovanu umesto primljenu svetlost.

Zakon obrnutog kvadrata: Irradiance od tačkastog izvora svetlosti opada sa kvadratom rastojanja. Ako si na dvostrukoj udaljenosti od sijalice, primaš četviri puta manje svetlosti. Na trostrukoj udaljenosti -- devet puta manje. Ovo je zato što se svetlost širi u sve pravce sferno, a površina sfere raste sa kvadratom poluprečnika (4πr²). Ista količina svetlosti se rasipa po sve većoj površini.

Zakon obrnutog kvadrata:

    ●  Izvor svetlosti
   /|\
  / | \
 /  |  \
/   |   \
────┼────  Rastojanje r   → Intenzitet I
    |
   /|\
  / | \
 /  |  \  
/   |   \ 
/   |   \
────┼────  Rastojanje 2r  → Intenzitet I/4
    |

Radiance (L) -- Zračenost

Fluks po jedinici površine po jedinici prostornog ugla, merena u W/(m²·sr).

Ovo je najvažnija radiometrijska veličina za rendering i zaslužuje posebnu pažnju.

Da bi razumeo radiance, moraš prvo da razumeš prostorni ugao (solid angle). Dok obični ugao (u 2D) meri koliki deo kruga pokriva neki luk (meri se u radijanima), prostorni ugao meri koliki deo sfere pokriva neka površina (meri se u steradijanima, sr). Cela sfera ima 4π steradijana, baš kao što ceo krug ima 2π radijana.

Zamisli da stojiš napolju i gledaš u nebo. Mesec pokriva mali deo tvog vidnog polja -- recimo 0.00006 steradijana. Sunce pokriva otprilike isti prostorni ugao (neverovatna koincidencija koja nam daje savršena pomračenja). Oblak na nebu pokriva mnogo veći prostorni ugao.

Sad, radiance meri koliko svetlosti putuje u specifičnom pravcu, sa specifičnog dela površine. Zamišljaj to ovako: irradiance ti kaže koliko ukupno svetlosti pada na površinu (iz svih pravaca). Radiance ti kaže koliko svetlosti dolazi (ili odlazi) iz jednog konkretnog pravca.

Ovo je ono što kamera (ili oko) zapravo "vidi". Kad gledaš u jednu tačku na nekom objektu, tvoje oko prima radiance iz tog pravca. Nije te briga koliko ukupno svetlosti pogađa taj objekat -- tebe zanima koliko svetlosti ide baš u pravcu tvog oka.

Ključna osobina radiance-a: Radiance se ne menja sa rastojanjem (u vakuumu). Ako gledaš objekat sa 1 metra ili sa 100 metara, radiance je isti. Zašto? Jer sa većeg rastojanja objekat zauzima manji prostorni ugao (izgleda manji), ali istovremeno svaki steradijan pokriva veću površinu izvora. Ovi efekti se tačno poništavaju. Zato udaljene planine ne izgledaju tamnije od bliskih objekata (ignorišući atmosferske efekte) -- radiance je konstantan.

Ovo je razlog zašto je radiance centralna veličina u rendering jednačini -- to je upravo ono što računamo za svaki piksel slike.

Pregled radiometrijskih veličina:

Veličina Simbol Jedinica Šta meri
Radiant Energy Q J (džul) Ukupna energija
Radiant Flux Φ W (vat) Energija po sekundi (snaga)
Irradiance E W/m² Fluks koji pada na površinu
Radiant Exitance M W/m² Fluks koji napušta površinu
Radiant Intensity I W/sr Fluks po prostornom uglu
Radiance L W/(m²·sr) Fluks po površini po prostornom uglu

Fotometrija -- svetlost iz perspektive oka

Fotometrija koristi iste koncepte kao radiometrija, ali svaku veličinu "filtrira" kroz luminosity function -- funkciju koja opisuje osetljivost ljudskog oka na različite talasne dužine. Ova funkcija (standardizovana od strane CIE kao V(λ)) ima oblik zvona sa vrhom na oko 555 nm (zeleno-žuta), što znači da je oko najosetljivije na zeleno-žutu svetlost, a mnogo manje osetljivo na plavu i crvenu, posebno na krajnjim delovima spektra.

Intuitivno, ovo znači: 1 vat zelene svetlosti izgleda mnogo svetlije ljudskom oku nego 1 vat crvene svetlosti, iako fizički nose istu energiju.

Fotometrijske veličine su direktni parnjaci radiometrijskih:

Radiometrija Fotometrija Jedinica Odnos
Radiant Flux (Φ) Luminous Flux lumen (lm) Fluks ponderisan osetljivošću oka
Irradiance (E) Illuminance lux (lx) = lm/m² Luminous flux po površini (koliko "svetla" je površina)
Radiance (L) Luminance cd/m² (nit) Svetlina kako je perceipira oko
Radiant Intensity (I) Luminous Intensity candela (cd) = lm/sr SI osnovna jedinica za svetlost

Luminous Flux (lumeni) -- Svetlosni fluks

Ukupna količina vidljive svetlosti koju izvor emituje u svim pravcima, merena u lumenima (lm).

Ovo je ono što vidiš na kutiji sijalice. Moderna LED sijalica od 10 W može da emituje 800 lumena -- što odgovara svetlini stare klasične sijalice od 60 W. Razlika je u efikasnosti -- LED pretvara mnogo veći procenat električne energije u vidljivu svetlost umesto u toplotu.

Tipične vrednosti:

Illuminance (luksi) -- Osvetljenost

Luminous flux po jedinici površine, meren u luxima (lx).

Ovo meri koliko je svetla neka površina -- ne koliko svetlosti emituje izvor, već koliko pada na konkretnu tačku. Isti izvor svetlosti daje različit illuminance na različitim udaljenostima i pod različitim uglovima.

Tipične vrednosti:

Primetite raspon -- od mesečine (0.25 lx) do direktnog sunca (100.000+ lx), razlika je skoro milion puta. Ljudsko oko se adaptira na ovaj ogroman raspon zahvaljujući mehanizmu adaptacije (zjenica se širi i skuplja, plus hemijska adaptacija fotoreceptora). U renderovanju, ovo je razlog zašto koristimo HDR (High Dynamic Range) i tone mapping -- ekran može da prikaže raspon svetlina od možda 1000:1, ali scena može da sadrži raspon od 1.000.000:1. Tone mapping kompresuje taj ogromni raspon u ono što ekran može da prikaže. Ali to je tema za neko od kasnijih poglavlja.

Luminance (niti) -- Sjajnost

Luminous intensity po jedinici vidljive površine, merena u kandelama po kvadratnom metru (cd/m²), što se naziva i nit.

Ovo je najdirektnija mera onoga što tvoje oko perceipira kad gleda u neku tačku. Kad gledaš u beli zid osvetljen lampu, luminance tog zida je ono što određuje koliko "svetao" ti se čini.

Tipične vrednosti:

Zašto je ovo bitno za UE5

Unreal Engine 5 koristi fotometrijske jedinice za svetla. Kad u UE5 postaviš Point Light i podesiš intenzitet, koristiš lumene (lm) za luminous flux ili kandele (cd) za luminous intensity. Kad postaviš Directional Light (sunce), koristiš lukse (lx) za illuminance na površini.

Ovo znači da možeš da koristiš vrednosti iz realnog sveta. Hoćeš sijalicu koja emituje koliko i tipična kućna lampa? Podesi na 800 lm. Hoćeš sunčev dan? Directional light na 80.000-120.000 lx. Ovo je ogromna prednost za realističan rendering jer ne radiš sa arbitrarnim brojevima -- koristiš fizički smislene vrednosti.

Ali matematika ispod haube je i dalje radiometrijska. Rendering equation (o kojoj govorimo u sledećem poglavlju) operira sa radiance-om i irradiance-om. Engine interno konvertuje tvoje fotometrijske inpute u radiometrijske vrednosti za proračun, a na kraju ponovo koristi fotometrijsku percepciju za tone mapping i prikaz na ekranu.

Zato moraš da razumeš oba sistema -- fotometriju za postavljanje scene, radiometriju za razumevanje jednačina.


10.3 Jednačina renderovanja (The Rendering Equation)

Sada dolazimo do srca celog poglavlja -- do jednačine koja opisuje kako svetlost interaguje sa površinama. Ovo je jednačina renderovanja (The Rendering Equation), koju je formulisao James Kajiya 1986. godine, i ona je temelj na kome počiva praktično svaki moderan renderer, bilo real-time ili offline.

Prvo -- intuicija

Pre nego što napišemo jednačinu, hajde da razumemo šta ona govori, koristeći analogiju.

Zamisli da stojiš na sredini sobe i gledaš u jednu tačku na zidu. Koliko svetlosti dolazi od te tačke ka tvom oku?

Ta svetlost dolazi iz dva izvora:

  1. Emisija: Ako ta tačka na zidu sama emituje svetlost (npr. ako je to ekran TV-a, ili žeravica, ili fluorescentna nalepnica), onda dolazi svetlost koju ta tačka sama proizvodi.

  2. Refleksija: Svetlost koja dolazi od te tačke ka tvom oku jer se odbila od nje. Ta odbijena svetlost je prethodno morala da stigne do te tačke -- odakle? Iz svih mogućih pravaca! Deo dolazi od sijalice na plafonu (direktna svetlost). Deo dolazi od poda koji je osvetljen tom istom sijalicom i koji odbija svetlost nazad ka zidu (indirektna svetlost -- prvi bounce). Deo dolazi od plafona koji je osvetljen svetlošću odbijenoj od poda koji je bio osvetljen sijalicom (indirektna svetlost -- drugi bounce). I tako u nedogled.

Jednačina renderovanja kaže: ukupna svetlost koja napušta tačku u nekom pravcu = svetlost koju ta tačka sama emituje + integral (zbir) sve svetlosti koja dolazi iz svih pravaca, pomnožen sa BRDF-om i kosinusnim faktorom.

Jednačina

Matematički:

Lo(p, ωo) = Le(p, ωo) + ∫Ω fr(p, ωi, ωo) · Li(p, ωi) · (ωi · n) dωi

Gde je:

Vizuelizacija

                    ωo (ka kameri)
                     ↗
                    /
                   /
              n (normala)
              ↑
              |    
──────────────●──────────────── Površina u tački p
             /|\
            / | \
           /  |  \   ← Hemisfera iznad tačke p
          /   |   \     (svi pravci iz kojih može doći svetlost)
         ωi₁  ωi₂  ωi₃
         ↗    ↑    ↖
        /     |     \
       /      |      \

 Za svaki pravac ωi na hemisferi:
   - Koliko svetlosti dolazi iz tog pravca? → Li(p, ωi)
   - Koliki deo tog svetla se odbija ka kameri? → fr(p, ωi, ωo)
   - Pod kojim uglom pada na površinu? → (ωi · n)
 Saberi sve te doprinose → to je integral

Razbijanje pojam po pojam

Hajde da detaljno razumemo svaki deo kroz konkretan primer. Zamislimo tačku na podu sobe, i želimo da izračunamo koliko svetlosti od te tačke ide ka kameri koja gleda odozgo.

Emisija Le: Pod ne svetli sam od sebe, pa je Le = 0. Da je to ekran laptop-a ili fluorescentna traka na podu, Le bi bio nenula.

Integral (sakupljanje svetlosti): Sa pozicije te tačke na podu, gledamo u sve pravce hemisfere iznad nje (jer svetlost ne može da dođe kroz čvrst pod -- samo odozgo). Šta "vidimo" iz te tačke?

Integral "sabere" doprinose iz svih ovih pravaca.

BRDF fr: Svaki od tih doprinosa se pomnoži sa BRDF-om -- funkcijom materijala poda. Ako je pod od poliranog mermera, BRDF će reflektovati većinu svetlosti u pravcu ogledala (specular reflection). Ako je pod od grubog betona, BRDF će rasuti svetlost ravnomerno u svim pravcima (diffuse reflection). BRDF je "karakter" materijala.

Kosinusni faktor (ωi · n): Svetlost koja dolazi sa plafona (skoro vertikalno) ima kosinusni faktor blizu 1 -- skoro pun doprinos. Svetlost koja dolazi od daleke tačke na zidu blizu poda (skoro horizontalno) ima kosinusni faktor blizu 0 -- minimalan doprinos.

Zašto je ovo nerešivo u real-time

Jednačina renderovanja je elegantna i fizički tačna, ali ima dva fundamentalna problema za real-time rendering:

Problem 1: Integral je beskonačno dimenzionalan. Hemisfera sadrži beskonačno mnogo pravaca. Da bi tačno izračunao integral, morao bi da "uzorkuješ" svetlost iz beskonačno mnogo pravaca -- što je nemoguće. Offline rendereri (poput path tracer-a) aproksimiraju ovaj integral stohastički -- uzorkuju stotine ili hiljade slučajnih pravaca i prosečuju rezultat. To je dovoljno tačno uz dovoljno uzoraka, ali zahteva milione uzoraka po pikselu, što traje sekunde do sati.

Problem 2: Rekurzija. Li(p, ωi) -- svetlost koja dolazi u tačku p iz pravca ωi -- je Lo neke druge tačke. A Lo te tačke zavisi od svetlosti koja dolazi u nju iz svih pravaca, uključujući potencijalno i svetlost od tačke p. Ovo je beskonačna rekurzija. Svetlost se odbija beskonačno puta. U praksi, svaki bounce nosi sve manje energije (jer se deo apsorbuje na svakom odbijanju), pa se može presecati (truncate) posle nekog broja bounce-ova -- ali čak i 2-3 bounce-a sa punim integralom po hemisferi je ogromno opterećenje.

Kako real-time rendering aproksimira jednačinu

Real-time rendering ne rešava rendering equation tačno. Umesto toga, koristi seriju pametnih aproksimacija:

1. Razdvajanje na direktno i indirektno osvetljenje:

Lo = Le + Lo_direct + Lo_indirect

Umesto jednog integrala, razdvajamo ga na dva dela:

2. Analitičke aproksimacije BRDF-a:

Umesto opšteg BRDF-a koji može biti proizvoljna funkcija, koristimo matematičke modele koji imaju closed-form rešenja (ili barem brze aproksimacije). Cook-Torrance model, GGX distribucija, Schlick aproksimacija Fresnel-a -- sve su to analitičke formule koje se brzo računaju u shaderu. O ovome detaljno u poglavlju 11 (PBR materijali).

3. Ograničenje broja bounce-ova:

Umesto beskonačne rekurzije, real-time rendering obično računa:

4. Precomputation (pretproračun):

Za statične objekte i svetla, možeš da izračunaš osvetljenje unapred (offline) i sačuvaš rezultat u teksturama (lightmaps) ili probe-ovima (irradiance probes, reflection probes). Ovo ti daje neograničene bounce-ove i perfektan kvalitet, ali samo za statične elemente scene.

5. Screen-space tehnike:

Neke efekte aproksimiraš koristeći samo informacije koje su već na ekranu -- SSAO (Screen Space Ambient Occlusion), SSR (Screen Space Reflections), SSGI (Screen Space Global Illumination). Brze su jer koriste podatke iz G-buffer-a, ali ograničene jer ne vide ono što nije na ekranu.

Svaka od ovih aproksimacija je tema za sebe i pokrivena je u kasnijim poglavljima. Ovde je bitno da razumeš da je rendering equation idealni cilj, a sve tehnike u real-time renderingu su kompromisi između tačnosti i brzine u pokušaju da se toj jednačini približimo.


10.4 BRDF -- Bidirectional Reflectance Distribution Function

BRDF je jedan od najvažnijih koncepata u renderovanju materijala. Ako rendering equation opisuje kako svetlost interaguje sa scenom, BRDF opisuje kako svetlost interaguje sa jednom površinom -- i to je ono što definiše vizuelni "karakter" materijala.

Šta je BRDF, intuitivno

Zamisli sledeći eksperiment. Uzmeš baterijsku lampu i usmeireš je na zid pod određenim uglom. Zatim šetaš po sobi i gledaš zid iz raznih pravaca. Koliko svetao izgleda zid iz svakog pravca?

Ako je zid od grubog, mat materijala (poput kreča), izgleda otprilike jednako svetao iz bilo kog pravca. Svetlost se "rasipa" ravnomerno.

Ako je zid od poliranog mermera, iz većine pravaca izgleda tamno, ali iz jednog specifičnog pravca (pravac ogledala baterijske lampe) izgleda veoma svetao. Svetlost se odbija pretežno u jednom pravcu.

Ako je zid od satinirane plastike, negde je između -- ima i difuznu komponentu (vidi se iz svih pravaca) i blagi sjaj (highlight) koji se pomera kad se ti pomeraš.

BRDF je matematička funkcija koja opisuje upravo ovo ponašanje. Za dati materijal, za dati par pravaca (odakle dolazi svetlost i odakle gledaš), BRDF ti kaže koliki deo dolazne svetlosti se odbija u posmatranom pravcu.

Formalna definicija

fr(p, ωi, ωo) = dLo(p, ωo) / (dE(p, ωi))

Gde je:

Intuitivno: BRDF je odnos "koliko svetlosti izlazi u nekom pravcu" prema "koliko svetlosti dolazi iz nekog pravca". Jedinica je 1/sr (inverzan steradijan).

BRDF je funkcija koja uzima četiri parametra (dva ugla za ulazni pravac, dva ugla za izlazni pravac -- ili ekvivalentno, dva 3D vektora na hemisferi) i vraća jednu vrednost (zapravo tri -- po jednu za R, G, B, jer materijali mogu da se ponašaju različito za različite boje). Ova četvorodimenzionalnost je razlog zašto je BRDF toliko ekspresivan -- može da opiše ogromnu raznolikost materijala.

Osobine fizički korektnog BRDF-a

Ne može bilo koja funkcija da bude validan BRDF. Fizički korektan BRDF mora da zadovolji tri uslova:

1. Reciprocitet (Helmholtz reciprocity)

fr(p, ωi, ωo) = fr(p, ωo, ωi)

Ako zameniš pravce ulazne i izlazne svetlosti, BRDF mora da da isti rezultat. Ovo je posledica fundamentalnih zakona fizike -- putevi svetlosti su reverzibilni. Ako svetlost koja dolazi iz pravca A i odbija se u pravac B ima određeni intenzitet, onda svetlost koja dolazi iz pravca B i odbija se u pravac A mora imati isti intenzitet.

Analogija: Zamisli tunel. Ako ušetaš sa jedne strane i izađeš na drugu, prolaz je isti kao kad ideš u suprotnom smeru. Svetlost isto tako -- put je "prohodan" u oba smera jednako.

2. Očuvanje energije (Energy conservation)

∫Ω fr(p, ωi, ωo) · (ωo · n) dωo ≤ 1,  za svako ωi

Površina ne sme da odbije više svetlosti nego što prima. Ukupna odbijena svetlost u svim pravcima mora biti manja ili jednaka upadnoj svetlosti. Razlika se apsorbuje (pretvara u toplotu).

Ovo je fundamentalno -- materijal ne može da "stvara" svetlost iz ničega. Savršeno belo ogledalo odbija 100% svetlosti (integral = 1). Crni objekat apsorbuje skoro sve (integral blizu 0). Sve ostalo je negde između.

Važna napomena za rendering: PBR (Physically Based Rendering) modeli striktno poštuju ovo pravilo, što je jedan od razloga zašto PBR materijali izgledaju uverljivo pod raznim uslovima osvetljenja. Stariji, ne-PBR modeli (poput Phong-a bez korekcije) mogu da krše ovo pravilo, što dovodi do nerealističnog izgleda -- npr. objekat koji "svetli" više nego što bi trebalo.

3. Nenegativnost (Non-negativity)

fr(p, ωi, ωo) ≥ 0,  za sve ωi, ωo

BRDF nikad ne sme da bude negativan. Negativna refleksija nema fizički smisao -- ne možeš da odbiješ "negativnu svetlost".

Lambertov BRDF (diffuse reflection)

Najjednostavniji mogući BRDF je Lambertov (Lambert-ov) model, koji opisuje idealnu difuznu površinu -- površinu koja rasipa svetlost potpuno ravnomerno u svim pravcima.

fr_Lambert = albedo / π

Da, to je cela formula. Albedo (ili diffuse color, ρ) je boja materijala -- koliki deo svetlosti svake boje se odbija (vrednost od 0 do 1 za svaki kanal). Deljenje sa π je normalizacioni faktor koji obezbeđuje očuvanje energije.

Zašto π? Jer integral kosinusno-ponderisanog BRDF-a preko hemisfere za konstantan BRDF vrednosti c daje π·c. Da bi integral bio ≤ 1 (očuvanje energije), BRDF mora biti ≤ 1/π za albedo = 1. Preciznije, integral kosinusnog faktora (ωi · n) po hemisferi je π, pa deljenje sa π daje korektnu normalizaciju.

Lambertov model je iznenađujuće koristan. Veliki broj materijala u realnom svetu se prilično dobro aproksimira Lambertovim modelom -- mat drvo, kreč na zidu, papir, tkanina, zemlja. Svaki put kad vidiš objekat koji izgleda jednako svetao iz bilo kog ugla (bez sjaja i highlight-a), to je blisko Lambertovom modelu.

U shaderima, Lambertovo osvetljenje za jedno tačkasto svetlo je:

// Lambertovo difuzno osvetljenje
float NdotL = max(dot(normal, lightDir), 0.0); // kosinusni faktor
float3 diffuse = lightColor * albedo * NdotL;  // BRDF * Li * cos(θ)

NdotL je dot product normale površine i pravca ka svetlu -- to je kosinusni faktor (ωi · n) iz rendering equation. Ako je dot product negativan, svetlost dolazi sa "pogrešne strane" površine, pa ga klempujemo na 0 (nema doprinosa). Ovaj proračun si video u poglavlju 02 kad smo pričali o dot productu -- sada razumeš zašto on tu postoji.

Lambertov model -- ravnomerno rasipanje:

         ↗  ↑  ↖
        ↗   |   ↖
       ↗    |    ↖       Svetlost se odbija ravnomerno
      ↗     |     ↖      u svim pravcima
     ↗      |      ↖
  ═══════════●═══════════  Površina
             ↑
             |
           Ulazna
          svetlost

Phong model (specular reflection)

Phong model (Bui Tuong Phong, 1975) dodaje specularnu (sjajnu, highlight) komponentu. To nije čist BRDF u striktnom smislu (originalna formulacija ne poštuje reciprocitet), ali je istorijski važan kao jedan od prvih modela specularnog osvetljenja, i koncept iza njega je fundamentalan.

Ideja: pored difuzne komponente koja rasipa svetlost u svim pravcima, mnogi materijali imaju i specularnu komponentu -- svetlost koja se odbija pretežno u pravcu ogledala (reflection direction). Polirana površina ima oštar, uski highlight. Mat-sjajna površina ima širok, mek highlight. Phong model ovo opisuje sa:

// Phong specularni model
float3 reflectDir = reflect(-lightDir, normal);  // pravac ogledala
float spec = pow(max(dot(reflectDir, viewDir), 0.0), shininess);
float3 specular = lightColor * specularColor * spec;

shininess (ili specular exponent) kontroliše koliko je highlight uzak:

Phong model -- usmereno odbijanje:

               highlight lobe
              ╱ ↑ ╲
             ╱  |  ╲
            ╱   |   ╲       Svetlost se odbija pretežno
           ╱    |    ╲      u pravcu ogledala
          ╱     |     ╲
  ═══════════════●═══════════  Površina
                ╱↑
               ╱ |
              ╱  |
          Ulazna svetlost

Blinn-Phong varijanta (James Blinn, 1977) koristi half vector umesto reflection vektora:

float3 halfVec = normalize(lightDir + viewDir);  // half vector
float spec = pow(max(dot(normal, halfVec), 0.0), shininess);

Half vector je vektor na pola puta između pravca svetla i pravca posmatranja. Blinn-Phong je fizički korektniji, brži za izračunavanje (ne zahteva reflect() operaciju), i daje vizuelno bolje rezultate za šire highlight-ove. Većina implementacija pre PBR ere je koristila Blinn-Phong.

Važno: I Phong i Blinn-Phong su empirijski modeli -- nisu izvedeni iz fizike, već su dizajnirani da "izgledaju okej". Moderni PBR modeli (Cook-Torrance, GGX) su fizički zasnovani i daju mnogo uverljivije rezultate. O njima detaljno u poglavlju 11.

Kombinovanje difuzne i spekularne komponente

Klasičan (pre-PBR) pristup je bio da se obe komponente prosto saberu:

float3 finalColor = ambient + diffuse + specular;

Gde je ambient konstantna boja koja aproksimira indirektno osvetljenje (veoma gruba aproksimacija -- o čemu ćemo govoriti u sekciji o indirektnom osvetljenju).

PBR pristup je sofisticiraniji -- koristi Fresnel-ov efekat i očuvanje energije da bi balansirao koliko svetlosti ide u difuznu vs specularnu komponentu, obezbeđujući da zbir ne prelazi primljenu energiju. O tome detaljno u poglavlju 11.

Izotropski vs anizotropski BRDF

Izotropski BRDF daje iste rezultate bez obzira na rotaciju površine oko njene normale. Većina materijala je izotropska -- obrti površinu oko normale i izgleda isto.

Anizotropski BRDF menja izgled kada se površina rotira oko normale. Primeri:

Anizotropski BRDF zahteva dodatni parametar -- tangent vector -- koji definiše pravac anizotropije na površini. UE5 podržava anizotropske materijale.

BSDF, BTDF, BSSRDF -- proširenja

BRDF opisuje samo refleksiju -- svetlost koja se odbija sa iste strane površine. Ali neke materijale to ne opisuje potpuno:

BTDF (Bidirectional Transmittance Distribution Function): Opisuje svetlost koja prolazi kroz površinu. Staklo, voda, tanka tkanina, list biljke -- svi propuštaju svetlost. BTDF opisuje kako svetlost menja pravac (refrakcija) i intenzitet prilikom prolaska.

BSDF (Bidirectional Scattering Distribution Function): Kombinacija BRDF-a i BTDF-a -- opisuje i refleksiju i transmisiju. Ovo je opštiji termin za materijale koji i odbijaju i propuštaju svetlost (npr. zamućeno staklo, tanki materijali).

BRDF vs BTDF:

      BRDF (refleksija)           BTDF (transmisija)
                                  
        ↗  ↑  ↖                         
       ↗   |   ↖                        
  ═════════●═════════              ═════════●═════════
           ↑                               ↑
           |                               |
         Ulaz                            Ulaz
                                           |
                                           ↓
                                        ↙  ↓  ↘
                                       ↙   |   ↘

BSSRDF (Bidirectional Subsurface Scattering Reflectance Distribution Function): Za materijale gde svetlost ulazi na jednom mestu, putuje kroz materijal, i izlazi na drugom mestu. Koža, mleko, voštane sveće, mermerni kamen, led -- svi pokazuju ovaj efekat (eng. subsurface scattering). Koža izgleda "meko" i "živo" upravo zato što svetlost ulazi u kožu, rasipa se kroz slojeve tkiva, i izlazi par milimetara dalje. BSSRDF opisuje ovaj transport svetlosti, i značajno je komplikovanija od BRDF-a jer zahteva dva parametra pozicije (gde ulazi i gde izlazi), ne samo jedan.

UE5 podržava subsurface scattering kroz Subsurface Profile shading model, koji aproksimira BSSRDF za materijale poput kože i voska.

Za ostatak ovog poglavlja i za poglavlje 11 (PBR), fokusiraćemo se na BRDF jer pokriva ogromnu većinu materijala u tipičnoj sceni.


10.5 Direktno vs indirektno osvetljenje

Ovo je jedna od najvažnijih podela u renderovanju i direktno proističe iz rendering equation.

Direktno osvetljenje (Direct illumination)

Direktno osvetljenje je svetlost koja putuje direktno od izvora svetlosti do površine bez ijednog odbijanja.

  ☀ Sunce
   \
    \   Direktan zrak
     \
      ↘
───────●───────── Površina
       p

Tačka p prima svetlost direktno od sunca. Nema posrednika, nema odbijanja. Ovo je najjednostavniji slučaj i relativno je lak za izračunavanje:

Za N svetala u sceni, direktno osvetljenje je suma N doprinosa -- konačna suma, ne integral. To je ono što ga čini efikasnim.

// Pseudo-kod za direktno osvetljenje sa N svetala
float3 directLight = float3(0, 0, 0);
for (int i = 0; i < numLights; i++) {
    float3 L = normalize(lightPos[i] - surfacePos);
    float NdotL = max(dot(normal, L), 0.0);
    float shadow = ComputeShadow(surfacePos, lightPos[i]);
    float3 brdf = EvaluateBRDF(normal, L, viewDir, material);
    directLight += lightColor[i] * brdf * NdotL * shadow * attenuation[i];
}

Ovo je suština pixel shader-a za osvetljenje o kome smo govorili u poglavlju 07 -- za svaki piksel, prolazi kroz svetla i sabira doprinose.

Indirektno osvetljenje (Indirect illumination / Global Illumination)

Indirektno osvetljenje je svetlost koja je bar jednom odbijena od neke druge površine pre nego što je stigla do posmatrane tačke.

  ☀ Sunce
   \
    \
     \
      ↘
───────●─────────── Zid (tačka q)
       q
        \
         \  Odbijena svetlost (1. bounce)
          \
           ↘
════════════●══════════ Pod (tačka p)
            p

Tačka p na podu prima svetlost koja je prvo pogodila zid u tački q, a zatim se odbila ka podu. Ovo je svetlost prvog "bounce-a" (odbijanja). Svetlost može da se odbije i više puta:

  ☀ Sunce → Zid → Pod → Plafon → ... → Tačka p
            1.     2.     3.    bounce-ovi

Sa svakim bounce-om, svetlost gubi energiju (deo se apsorbuje) i menja boju (prima boju površine od koje se odbila). Zato u sobi sa crvenim zidovima imaš blago crvenkast ton na belom plafonu blizu zida -- svetlost se odbila od crvenog zida i donela sa sobom crvenkast ton. Ovaj efekat se zove color bleeding (prelivanje boja) i jedan je od najočiglednijih znakova indirektnog osvetljenja.

Zašto je indirektno osvetljenje toliko važno

Pogledaj oko sebe. Svetlost u sobi gde sediš ne dolazi samo direktno od lampe. Najveći deo svetlosti je zapravo indirektna -- odbijena od zidova, plafona, poda, nameštaja. Čak i na otvorenom, svetlost neba je indirektna -- to je sunčeva svetlost koja se rasejala u atmosferi i dolazi iz svih pravaca.

Evo šta se dešava u sceni ako renderuješ samo direktno osvetljenje:

  Samo direktno:                    Direktno + indirektno:
  
  ☼ ← svetlo                       ☼ ← svetlo
  ┌──────────────┐                  ┌──────────────┐
  │              │                  │  ░░░░░░░░░░  │
  │     ██       │                  │  ░░░████░░░  │
  │     ██ ↗ osvetljeno            │  ░░░████░░░  │ ← svetlo svuda,
  │     ██       │                  │  ░░░████░░░  │   boja se preliva
  │▓▓▓▓▓▓▓▓▓▓▓▓▓│ ← senka potpuno  │  ░░▓▓▓▓▓░░  │ ← senke su meke,
  │▓▓▓▓▓▓▓▓▓▓▓▓▓│   crna          │  ░░░░░░░░░░  │   imaju boju
  └──────────────┘                  └──────────────┘

Bez indirektnog osvetljenja:

Sa indirektnim osvetljenjem:

Indirektno osvetljenje je ono što razdvaja "izgleda kao igra" od "izgleda kao fotografija". To je jedan od ključnih razloga zašto je Epic Games uložio toliko truda u Lumen -- dinamički GI sistem u UE5.

Terminologija: GI (Global Illumination)

Global Illumination (GI) je opšti termin za tehnike koje simuliraju indirektno osvetljenje. "Globalno" osvetljenje znači da se uzima u obzir interakcija svetlosti sa celom scenom -- ne samo direktan put svetlo→površina, već i svi indirektni putevi svetlo→površina→površina→...→površina.

Tehnike za GI obuhvataju:

Svaka od ovih tehnika predstavlja drugačiji kompromis između kvaliteta, brzine i fleksibilnosti. Nema savršenog rešenja -- biraš u zavisnosti od potreba projekta.

Rekurzivna priroda rendering equation

Hajde da naglasim jedan koncept koji je ključan za razumevanje zašto je GI toliko teška.

U rendering equation, Li(p, ωi) -- svetlost koja dolazi u tačku p iz nekog pravca -- je zapravo Lo neke druge tačke u sceni. A Lo te druge tačke je opet definisan rendering equation-om, koja zavisi od Li u toj tački, što je Lo neke treće tačke... i tako u nedogled.

Lo(p) = Le(p) + ∫ fr · Li(p) · cos dω
                         ↑
                    Li(p) = Lo(q)  ← za neku tačku q koju p "vidi"
                                ↑
                           Lo(q) = Le(q) + ∫ fr · Li(q) · cos dω
                                                    ↑
                                               Li(q) = Lo(r) ← ...

Ovo je beskonačna rekurzija. Svaka površina u sceni je istovremeno prijemnik i izvor indirektne svetlosti. Pod prima svetlost od plafona, i istovremeno odbija svetlost nazad ka plafonu. Zidovi se međusobno osvetljavaju. Sve interaguje sa svim.

Zato je GI tako računarski zahtevna -- ne možeš da izračunaš osvetljenje jedne tačke nezavisno od ostatka scene. Matematički, ovo je Fredholm-ova integralna jednačina druge vrste, i njeno rešenje zahteva ili iterativne metode (bounce po bounce dok ne konvergira) ili stohastičke metode (Monte Carlo -- bacaš nasumične zrake i prosečuješ).

Offline rendereri ovo rešavaju na "grubu silu" -- prate milione zraka sa višestrukim bounce-ovima za svaki piksel, satima ili danima. Real-time rendereri koriste razne trikove i aproksimacije opisane iznad. Oba pristupa su validna za svoje domene.


10.6 Lambertov kosinusni zakon -- detaljnije

Kosinusni faktor (ωi · n) u rendering equation zaslužuje malo dublje objašnjenje jer je fundamentalno važan, a često se prihvata bez razumevanja zašto postoji.

Fizička intuicija

Zamisli da držiš list papira horizontalno i da kiša pada vertikalno nadole. Papir hvata maksimalnu količinu kiše -- svaki kvadratni centimetar papira prima punu "dozu" kišnih kapi.

Sada nagnij papir pod uglom od 45°. Ista kiša i dalje pada, ali sada papir hvata manje kapi po kvadratnom centimetru -- jer je efektivna površina koju papir "izlaže" kiši manja. Konkretno, efektivna površina je stvarna površina pomnožena sa kosinusom ugla. Na 45°, cos(45°) ≈ 0.707, pa papir hvata oko 70% kiše u poređenju sa horizontalnim položajem.

Ako nagnješ papir na 90° (vertikalno), kiša uopšte ne pada na njega -- cos(90°) = 0. Efektivna površina je nula.

Potpuno ista stvar se dešava sa svetlošću. Površina koja je okrenuta direktno ka izvoru svetlosti prima maksimalan fluks po jedinici površine. Površina pod uglom prima manje. Površina paralelna sa pravcem svetlosti ne prima ništa.

Kosinusni zakon:

  Svetlost pada            Svetlost pada          Svetlost pada
  vertikalno               pod 45°                paralelno
       ↓  ↓  ↓  ↓              ↘  ↘  ↘             →  →  →
  ═══════════════          ═══╱═══════╲═══         ═══════════
   cos(0°) = 1.0           cos(45°) ≈ 0.7         cos(90°) = 0
   Puna osvetljenost       70% osvetljenosti      Nema osvetljenosti

Ovo je razlog zašto su leti dane toplije -- ne zato što je sunce bliže Zemlji (zapravo, u julu je Zemlja najdalje od Sunca), nego zato što sunčevi zraci padaju pod manjim uglom na severnu hemisferu, pa je kosinusni faktor veći -- svaki kvadratni metar Zemlje prima više sunčeve energije.

Veza sa dot productom

Kosinusni faktor u rendering equation je cos(θi) = ωi · n, gde je θi ugao između pravca dolazne svetlosti i normale površine.

Kao što smo naučili u poglavlju 02, dot product dva jedinična vektora daje kosinus ugla između njih. Normala n je jedinični vektor. Pravac svetla ωi je (ili treba da bude) jedinični vektor. Dakle, ωi · n = cos(θi).

Kada je dot product negativan, to znači da svetlost dolazi "sa pogrešne strane" površine (ugao > 90°), pa rezultat klempujemo na 0 -- max(dot(ωi, n), 0.0). Ovo se u shader kodu vidi svuda i sada razumeš zašto.


10.7 Light Transport Notation (Heckbert-ova notacija)

Ovaj deo je kraći, ali je izuzetno koristan za razumevanje terminologije koju ćeš sresti u tehničkim radovima, GDC prezentacijama, i dokumentaciji GI sistema.

Problem komunikacije

Kad pričamo o osvetljenju, često želimo da opišemo puteve svetlosti -- kako svetlost putuje od izvora do kamere, odbijajući se od raznih površina. Problem je što opis tih puteva prirodnim jezikom brzo postaje nezgrapan:

Paul Heckbert je 1990. predložio elegantnu notaciju za opis puteva svetlosti koristeći regularne izraze (regular expressions). Ova notacija je postala standard u akademskoj i industrijskoj zajednici.

Osnovni simboli

Simbol Značenje
L Light -- izvor svetlosti. Početna tačka puta svetlosti.
E Eye -- kamera/oko. Krajnja tačka puta svetlosti.
D Diffuse -- difuzno odbijanje (ravnomerno u svim pravcima).
S Specular -- specularno odbijanje (usmereno, poput ogledala).

I koriste se regex operatori:

Operator Značenje
(zvezdica) Nula ili više ponavljanja
+ Jedno ili više ponavljanja
| Ili (alternativa)
(...) Grupisanje

Primeri puteva

LDE -- Svetlost (L) se difuzno (D) odbija i dolazi do kamere (E). Ovo je najjednostavniji put -- direktno difuzno osvetljenje. Kad sunce osvetli mat zid i ti gledaš taj zid -- to je LDE put.

LSE -- Svetlost se spekulorno odbija i dolazi do kamere. Kad vidiš odsjaj sunca na staklu ili metalnoj površini -- to je LSE put.

LDDE -- Svetlost se difuzno odbija dva puta. Sunce osvetli zid (prvi D bounce), svetlost sa zida osvetli pod (drugi D bounce), a pod vidiš kamerom. Ovo je indirektno osvetljenje sa jednim bounce-om.

LD*E -- Svetlost se difuzno odbija nula ili više puta pre kamere. Ovo pokriva LDE, LDDE, LDDDE, itd. -- sve difuzne puteve sa proizvoljnim brojem bounce-ova.

L(D|S)*E -- Svetlost se proizvoljno mnogo puta odbija (difuzno ili spekulorno) pre kamere. Ovo je sva svetlost -- kompletna rendering equation. Svaki mogući put od svetla do kamere odgovara nekom nizu D-ova i S-ova.

Zašto je ovo korisno

Ova notacija ti omogućava da precizno opiše šta neka tehnika renderovanja podržava:

GI tehnika Putevi koje podržava Opis
Direktno osvetljenje L(D|S)E Samo jedan bounce
Lightmaps LD*E Višestruko difuzno odbijanje, ali ne spekulorno
Reflection probes L(D|S)*SE Putevi koji završavaju specularnim odbijanjem
Screen Space Reflections L(D|S)*SE (ograničeno) Spekularna refleksija, ali samo vidljivih objekata
Path tracing L(D|S)*E Svi mogući putevi -- kompletna rendering equation
Lumen (UE5) L(D|S)(D|S)*E (aproksimativno) Višestruka odbijanja, ali sa aproksimacijama
Photon mapping LS*D(D|S)*E Kaustika -- specularno fokusirana svetlost

Kaustika je posebno interesantan slučaj: to su putevi tipa LS+DE -- svetlost koja se spekulorno odbija (ili prelama) jednom ili više puta, a zatim difuzno rasipa. Primeri: svetlosni uzorci na dnu bazena (svetlost prelomljena kroz talase vode), svetlost fokusirana kroz čašu na sto. Ovi putevi su notorno teški za real-time rendering -- većina GI sistema ih ne podržava.

Heckbert-ova notacija ti pomaže da razumeš ograničenja svake tehnike. Kad neko kaže "Lumen ne podržava kaustiku", sada znaš šta to znači -- ne podržava LS+D puteve.


10.8 Tipovi svetlosnih izvora u teoriji

Pre nego što pređemo na praktičnu primenu (poglavlje 11 i dalje), hajde da razumemo teoretske modele svetlosnih izvora koje real-time rendering koristi.

Point Light (tačkasti izvor)

Idealizovani izvor svetlosti koji emituje svetlost iz jedne tačke ravnomerno u svim pravcima. U realnosti, ovakav izvor ne postoji -- svaka sijalica ima fizičku veličinu. Ali point light je korisna aproksimacija za male izvore (sijalice, sveće) posmatrane sa dovoljnog rastojanja.

Tačkasti izvor:

             ↖ ↑ ↗
            ↖  |  ↗
         ← ── ● ── →    Svetlost ide u svim pravcima ravnomerno
            ↙  |  ↘
             ↙ ↓ ↘

Intenzitet opada sa kvadratom rastojanja (zakon obrnutog kvadrata): I = I₀ / d²

U UE5, Point Light koristi lumene (lm) za intenzitet i ima podesivu attenuation radius (poluprečnik uticaja) -- izvan tog radijusa svetlo ne utiče na ništa, što je optimizacija (u realnosti svetlost nikad potpuno ne nestaje, ali na dovoljnom rastojanju postaje zanemarljiva).

Directional Light (usmereni izvor)

Izvor svetlosti koji je beskonačno daleko i emituje paralelne zrake u jednom pravcu. Ovo je aproksimacija sunčeve svetlosti -- sunce je toliko daleko da su njegovi zraci praktično paralelni kad stignu do Zemlje.

Usmereni izvor (sunce):

      ↓    ↓    ↓    ↓    ↓    ↓
      ↓    ↓    ↓    ↓    ↓    ↓    Paralelni zraci
      ↓    ↓    ↓    ↓    ↓    ↓
  ═══════════════════════════════

Nema atenuacije -- intenzitet je isti na svakom rastojanju (jer je izvor beskonačno daleko). Intenzitet se meri u luxima (lx).

Spot Light (usmereni reflektorski izvor)

Kao point light, ali sa ograničenim konusom emisije. Svetlost se emituje samo unutar definisanog ugla. Aproksimacija reflektorskih svetala, baterijskih lampi, automobilskih farova.

Reflektorski izvor:

         ●  izvor
        /|\
       / | \
      /  |  \
     / inner \
    /  cone   \
   /     |     \
  / outer cone  \
 /       |       \
/________|________\
   attenuation

Ima dva ugla: inner cone angle (pun intenzitet) i outer cone angle (intenzitet opada ka nuli). Intenzitet takođe opada sa rastojanjem.

Rect Light / Area Light (površinski izvor)

Izvor svetlosti koji ima fizičku površinu -- pravougaonik, disk, ili proizvoljan oblik. Ovo je najrealističniji model jer sve realne svetlosne izvore (ekrani, prozori, fluorescentne cevi, softbox-ovi) imaju površinu.

Površinski izvor:

  ┌─────────────┐
  │  ↓  ↓  ↓  ↓ │   Svetlost se emituje
  │  ↓  ↓  ↓  ↓ │   sa cele površine
  │  ↓  ↓  ↓  ↓ │
  └─────────────┘

Area lights proizvode mekan sene (soft shadows) -- senka objekta nije oštrog ruba jer svetlost dolazi sa cele površine izvora, ne iz jedne tačke. Ovo je fizički najkorektnije, ali i najskuplje za izračunavanje.

UE5 podržava Rect Lights za specularni doprinos (reflection), ali za potpunu soft shadow simulaciju sa area lights obično se koriste aproksimacije.

Emisivne površine

U rendering equation, bilo koja površina koja ima nenula Le(p, ωo) je izvor svetlosti. Ovo uključuje objekte sa emissive materijalima -- neonske oznake, ekrane, užarene objekte. U fizički baziranom renderovanju, ovo su "pravi" izvori svetlosti -- svetlost se emituje sa površine i interaguje sa scenom kao i svaka druga svetlost.

U praksi, Lumen u UE5 podržava emissive materijale kao izvore indirektne svetlosti -- emissive objekat može da osvetli okolne površine. Ovo je jedan od razloga zašto je Lumen toliko impresivan.

Sky Light (nebesko svetlo)

Model svetlosti koja dolazi "od svuda" -- tipično od neba, ali konceptualno od bilo kog okruženja. Koristi environment map (HDR slika ili cubemap) koja opisuje radiance iz svakog pravca. Ovo je efektivno beskonačno daleki area light koji okružuje celu scenu.

Sky light je dominantan izvor indirektnog osvetljenja u spoljnim scenama -- plavo nebo osvetljava senke plavkastom svetlošću (to je indirektna sunčeva svetlost rasejana u atmosferi), oblačno nebo daje ravnomerno, meko osvetljenje bez oštrih senki.


10.9 Praktične implikacije za UE5

Sva ova teorija ima direktne praktične posledice za rad u Unreal Engine 5. Evo nekoliko ključnih take-away-a:

Koristite fizičke vrednosti za svetla

UE5 koristi fotometrijske jedinice. Koristite realne vrednosti:

Ovo daje konzistentan, fizički uverljiv rezultat. Nemojte da "na oko" podešavate intenzitete -- počnite od fizičkih vrednosti i fino tunirajte odatle.

Razumite kosinusni faktor

Kad se čudite zašto površina pod oštrim uglom izgleda tamno, setite se kosinusnog zakona. To nije bag -- to je fizika. Normala površine i pravac svetla daju dot product koji određuje koliko svetlosti ta površina prima.

BRDF determiniše izgled materijala

Ako vam materijal ne izgleda kako treba, problem je verovatno u BRDF parametrima (Roughness, Metallic, Base Color u PBR terminologiji). Razumevanje šta BRDF zapravo radi -- opisano u ovom poglavlju -- vam pomaže da inteligentno dijagnostikujete i rešite problem umesto nasumičnog pomeranja slajdera. Detaljna primena u poglavlju 11.

GI je kritičan za realizam

Nikad ne zanemarujte globalno osvetljenje. Scena sa savršenim modelima i teksturama, ali bez GI, izgleda loše. Scena sa prosečnim asset-ima ali sa dobrim GI izgleda uverljivo. Lumen je tu da reši ovaj problem u realnom vremenu, ali morate razumeti šta on radi (poglavlje 12) da biste ga ispravno koristili i optimizovali.

HDR i tone mapping su neophodni

Raspon svetlina u realnom svetu je ogroman (milion puta razlike između mesečine i sunčevog dana). Vaš ekran može da prikaže možda 1000:1 raspon. HDR rendering čuva pune fizičke vrednosti tokom proračuna, a tone mapping ih kompresuje za prikaz. Ako ne razumete ovaj pipeline, vaše scene će izgledati "isprano" ili "pregorelo".


10.10 Povezivanje sa ostalim poglavljima

Znanje iz ovog poglavlja je teorijski temelj na kome počivaju mnoga naredna poglavlja:


Rezime ključnih pojmova

Pojam Značenje
Elektromagnetni spektar Celokupan raspon elektromagnetnog zračenja; vidljiva svetlost je mali deo (380-780 nm)
Radiometrija Fizičko merenje elektromagnetnog zračenja u apsolutnim jedinicama (W, W/m², W/m²/sr)
Fotometrija Merenje svetlosti ponderisano osetljivošću ljudskog oka (lm, lx, cd/m²)
Radiant Flux (Φ) Snaga elektromagnetnog zračenja u vatima (W)
Irradiance (E) Fluks po površini koji pada na površinu, W/m²
Radiance (L) Fluks po površini po prostornom uglu, W/m²/sr -- centralna veličina za rendering
Luminous Flux Fotometrijski ekvivalent radiant flux-a, u lumenima (lm)
Illuminance Fotometrijski ekvivalent irradiance, u luxima (lx)
Luminance Fotometrijski ekvivalent radiance, u nitima (cd/m²)
Prostorni ugao (solid angle) Mera dela sfere, u steradijanima (sr); cela sfera = 4π sr
Rendering Equation Jednačina koja opisuje kompletnu interakciju svetlosti sa scenm: Lo = Le + ∫ fr·Li·cos dω
BRDF Bidirectional Reflectance Distribution Function -- opisuje kako materijal odbija svetlost
Lambertov model Najjednostavniji BRDF: difuzna površina koja rasipa svetlost ravnomerno (fr = albedo/π)
Phong/Blinn-Phong Empirijski modeli specularnog osvetljenja sa podesivom oštlinom highlight-a
Reciprocitet Osobina BRDF-a: zamena ulaznog i izlaznog pravca daje isti rezultat
Očuvanje energije Osobina BRDF-a: ukupna odbijena svetlost ≤ ulazna svetlost
Direktno osvetljenje Svetlost koja putuje direktno od izvora do površine bez odbijanja
Indirektno osvetljenje Svetlost koja se bar jednom odbila od druge površine pre nego što je stigla do posmatrane tačke
Global Illumination (GI) Opšti termin za tehnike simuliranja indirektnog osvetljenja
Color bleeding Efekat prelivanja boja -- indirektna svetlost nosi boju površine od koje se odbila
BTDF Bidirectional Transmittance Distribution Function -- za propuštanje svetlosti kroz materijal
BSDF Bidirectional Scattering Distribution Function -- kombinacija BRDF + BTDF
BSSRDF Subsurface scattering -- svetlost ulazi na jednom mestu i izlazi na drugom
Heckbert-ova notacija L, E, D, S notacija za opis puteva svetlosti (npr. LDE, LS*DE)
Kosinusni faktor dot(ωi, n) = cos(θ) -- smanjenje primljene svetlosti pod uglom
Zakon obrnutog kvadrata Intenzitet od tačkastog izvora opada sa d² (dvostruka udaljenost = četvrtina intenziteta)
Metamerizam Fizički različite svetlosti koje izgledaju identično za ljudsko oko

Sledeće poglavlje primenjuje svu ovu teoriju u praksi -- PBR materijali, Cook-Torrance model, metallic/roughness workflow, Fresnel efekat. Od jednačina ka pikselima.

Dalje čitanje:

  • "Physically Based Rendering: From Theory to Implementation" -- Matt Pharr, Wenzel Jakob, Greg Humphreys (biblija PBR-a, besplatno dostupna na pbr-book.org)
  • "Real-Time Rendering, 4th Edition" -- Akenine-Moller, Haines, Hoffman (poglavlja 7-9 pokrivaju osvetljenje i materijale)
  • "The Rendering Equation" -- James Kajiya, 1986 (originalni rad, dostupan online)
  • "An Introduction to BRDF-Based Lighting" -- Chris Wynn, NVIDIA (pristupačan uvod u BRDF)
  • "Moving Frostbite to Physically Based Rendering" -- Sebastien Lagarde, Charles de Rousiers, SIGGRAPH 2014 (praktična primena PBR u AAA engine-u)
  • "Background: Physics and Math of Shading" -- Naty Hoffman, SIGGRAPH Course (odličan pregled radiometrije za rendering)
  • "Unreal Engine 5 Lighting Documentation" -- Epic Games (praktični vodiči za osvetljenje u UE5)
  • "Global Illumination Compendium" -- Philip Dutré (besplatan pregled GI tehnika i formula)