Poglavlje 48: Svetlo i Senke --- Optimizacija
Uvod
Dobrodosli u jedno od najvaznijih poglavlja ove knjige. Ako ste pratili nas put od pocetka, prosli ste kroz osnove svetla (Poglavlje 23), tipove senki (Poglavlje 13), Lumen globalno osvetljenje (Poglavlje 25) i Virtual Shadow Maps (Poglavlje 31). Sada je vreme da sve to spojimo u jednu celinu i naucimo kako da optimizujemo svetlo i senke tako da vas projekat radi glatko, bez obzira na ciljnu platformu.
Svetlo je, bez preterivanja, jedan od najskupljih delova renderinga u realnom vremenu. Svaki svetlosni izvor koji dodate u scenu kosta --- i to ne samo u smislu lepote kadra, vec u smislu milisekundi koje GPU trosi na obradu. Razlika izmedju scene koja radi na 60 FPS i scene koja jedva doseze 30 FPS cesto lezi upravo u tome koliko svetala imate, koliko njih baca senke i kako su konfigurisana.
U ovom poglavlju cemo proci kroz sve aspekte optimizacije svetla i senki u Unreal Engine 5 --- od fundamentalnih principa kao sto je Light Complexity, preko Lumen podesavanja, pa sve do prakticnih strategija koje mozete odmah primeniti u vasem projektu.
Hajde da pocnemo.
48.1 Light Complexity --- Razumevanje Cene Svetla
Sta je Light Complexity?
Light Complexity je vizualizacioni rezim u Unreal Engine-u koji vam pokazuje koliko svetlosnih izvora utice na svaki piksel na ekranu. Mozete ga aktivirati preko View Mode padajuceg menija u Viewport-u --- izaberite Optimization Viewmodes > Light Complexity.
Kada aktivirate ovaj rezim, scena se prikazuje u boji:
- Crna/tamno zelena --- mali broj svetala utice na piksel (0--2). Ovo je idealno.
- Zelena --- umeren broj svetala (3--4). Prihvatljivo za vecinu scena.
- Zuta --- poviseni broj svetala (5--6). Pocnite da razmisljate o optimizaciji.
- Narandzasta --- visok broj svetala (7--8). Performanse ce patiti.
- Crvena --- prevelik broj svetala (9+). Hitno potrebna optimizacija.
Vazno: Light Complexity vam ne pokazuje ukupnu cenu renderinga --- pokazuje samo koliko svetala se preklapa na datom pikselu. Ali to je izuzetno koristan alat jer vam daje vizuelnu mapu "vrucih tacaka" u vasoj sceni.
Kako Piksel "Vidi" Svetla
Da bismo razumeli zasto je preklapanje svetala problem, moramo razumeti kako GPU renderuje osvetljenje. Za svaki piksel na ekranu, GPU mora da:
- Odredi koja svetla uticu na taj piksel (na osnovu Attenuation Radius-a svetla i pozicije piksela).
- Izracuna doprinos svakog svetla --- to ukljucuje evaluaciju BRDF funkcije (Bidirectional Reflectance Distribution Function), proveru senki, primenu Light Function-a itd.
- Sabere sve doprinose da bi dobio konacnu boju piksela.
Svaki od ovih koraka kosta. A kljucna stvar je da se cena množi sa brojem svetala. Ako imate 5 svetala koja uticu na isti piksel, GPU mora da uradi 5 puta vise posla nego da imate samo jedno svetlo.
Attenuation Radius --- Kljucni Parametar
Svako Point Light i Spot Light u Unreal Engine-u ima parametar koji se zove Attenuation Radius. Ovo je sfericni (ili konicni, kod Spot Light-a) prostor oko svetla u kome ono ima uticaj. Pikseli van ovog radijusa uopste ne "vide" to svetlo i GPU ih ne obradjuje.
Problem nastaje kada se Attenuation Radius-i vise svetala preklapaju. Zamislite hodnik sa 10 zidnih svetiljki. Ako svaka ima Attenuation Radius od 1000 unita, a svetiljke su razmaknute po 200 unita, onda se u centru hodnika moze preklopiti 5, 6 ili cak vise svetala. To znaci da GPU za svaki piksel u toj zoni mora da izracuna doprinos svih tih svetala.
// Vizuelni prikaz preklapanja (pogled odozgo)
Svetlo A: [==========]
Svetlo B: [==========]
Svetlo C: [==========]
^^^^^^^^^^^^
Zona preklapanja --- GPU racuna
sva tri svetla za svaki piksel ovde
Prakticno pravilo: Smanjite Attenuation Radius na minimum koji i dalje izgleda dobro. Ako svetlo realisticno ne dopire dalje od 300 unita, nemojte ostavljati Attenuation Radius na podrazumevanoj vrednosti od 1000 unita.
Forward vs Deferred Rendering i Svetla
Unreal Engine 5 podrazumevano koristi Deferred Rendering pipeline. U ovom pristupu, svetla se obradjuju u posebnom prolazu (Light Pass) nakon sto je geometrija vec renderovana u G-Buffer. Prednost je sto cena svetla ne zavisi od slozenosti geometrije, ali i dalje zavisi od broja piksela koje svetlo pokriva.
U Forward Rendering rezimu (koji se koristi za VR i neke mobilne projekte), situacija je jos kriticnija. Svako svetlo se obradjuje direktno tokom renderovanja geometrije, sto znaci da je cena svetla proporcionalna i broju svetala i slozenosti geometrije. Forward Rendering obicno ima tvrd limit na broj svetala po objektu (podrazumevano 4 u mobilnom rezimu).
| Rendering Path | Limit Svetala | Cena po Svetlu | Preporuka |
|---|---|---|---|
| Deferred (Desktop) | Praktično neogranicen | Umerena | Do 8 preklapajucih svetala |
| Forward (VR) | 4--16 po objektu | Visoka | Maksimalno 4 preklapajuca |
| Mobile Forward | 4 po objektu (tvrd limit) | Vrlo visoka | Koristite baked lighting |
48.2 Problem Preklapajucih Svetala
Zasto je Svako Dodatno Svetlo Skupo
Hajde da budemo potpuno konkretni. Kada GPU obradjuje piksel koji je osvetljen sa N svetala, on mora da izvrsi N evaluacija shader-a za osvetljenje. Svaka evaluacija ukljucuje:
- Izracunavanje rastojanja od piksela do svetla i primenu Attenuation funkcije (Inverse Square Falloff ili prilagodjena kriva).
- Evaluaciju BRDF-a --- Diffuse (Lambert ili Disney Diffuse) i Specular (GGX). Ovo je matematicki intenzivan korak.
- Shadow Test --- ako svetlo baca senke, GPU mora da uzorkuje Shadow Map da odredi da li je piksel u senci. Ovo je posebno skupo (videti sekciju 48.5).
- Light Function evaluaciju --- ako svetlo koristi Light Function materijal.
- IES Profile uzorkovanje --- ako svetlo koristi IES profil za realisticnu distribuciju svetlosti.
Dakle, svako dodatno svetlo na pikselu dodaje sve ove korake. Ako imate 8 svetala na istom pikselu, GPU obavlja 8 kompletnih evaluacija.
Primer iz Prakse
Zamislite unutrasnji prostor --- recimo, kancelarijski open space. Dizajner postavlja:
- 20 plafonskih svetala (Point Light)
- 10 desk lampi (Spot Light)
- 5 dekorativnih svetala na zidovima (Point Light)
- 1 Directional Light za svetlost kroz prozore
Ako sva ova svetla imaju velike Attenuation Radius vrednosti i sva bacaju senke, scena ce biti izuzetno skupa za renderovanje. U najgorem slucaju, pikseli u centru prostorije mogu biti pod uticajem 15--20 svetala istovremeno.
Resenje: Ovu scenu treba pristupiti sistematski:
- Smanjiti Attenuation Radius svakog plafonskog svetla tako da pokriva samo oblast ispod njega (recimo 400--600 unita umesto podrazumevanih 1000).
- Desk lampe postaviti kao Spot Light sa uskim uglom (Inner Cone Angle 20--30 stepeni) i malim Attenuation Radius-om (200--300 unita).
- Dekorativna svetla ne treba da bacaju senke --- iskljuciti Cast Shadows.
- Samo 2--3 najvaznija svetla treba da bacaju dinamicke senke.
- Razmotriti koriscenje Stationary ili Static svetala za plafonska svetla ako se ne menjaju tokom igre.
Vizualizacija i Debagovanje
Pored Light Complexity vizualizacije, Unreal Engine nudi jos nekoliko alata za debagovanje:
- Shader Complexity (View Mode > Optimization Viewmodes > Shader Complexity) --- pokazuje ukupnu slozenost shader-a po pikselu, ukljucujuci i svetla.
- Stationary Light Overlap --- pokazuje gde se preklapaju vise od 4 Stationary svetla (sto je limit za Stationary svetla sa statickim senkama).
- stat GPU konzolna komanda --- prikazuje detaljno vreme koje GPU trosi na razlicite prolaze, ukljucujuci Lights i Shadows.
- ProfileGPU (Ctrl+Shift+, u editoru) --- daje hijerarhijski prikaz GPU rada po prolazima.
Koristite ove alate redovno tokom razvoja. Nemojte cekati kraj projekta da biste otkrili da vasa scena ima problema sa performansama.
48.3 Budzetiranje Svetala koja Bacaju Senke
Zasto su Senke Toliko Skupe
Senke su, jednostavno receno, najskuplji aspekt osvetljenja u realnom vremenu. Da bismo razumeli zasto, hajde da pogledamo sta se desava kada svetlo baca senke:
- Shadow Map renderovanje --- GPU mora da renderuje scenu iz perspektive svetla, zapisujuci dubinu (depth) svakog piksela u posebnu teksturu (Shadow Map). Ovo je u sustini dodatni renderovanje cele scene (ili njenog dela) za svako svetlo koje baca senke.
- Shadow Map uzorkovanje --- tokom glavnog renderovanja, za svaki piksel koji je osvetljen tim svetlom, GPU mora da uzorkuje Shadow Map da odredi da li je piksel u senci ili ne.
- Shadow Map filtriranje --- da bi senke izgledale glatko (bez aliasing-a), koristi se filtriranje (PCF --- Percentage Closer Filtering, PCSS --- Percentage Closer Soft Shadows, ili slicni algoritmi), sto zahteva vise uzorkovanja.
Shadow Map Budzet po Tipu Svetla
Razliciti tipovi svetla imaju razlicite cene za Shadow Map:
Directional Light (1 Shadow Map, ali sa Cascaded Shadow Maps)
Directional Light koristi Cascaded Shadow Maps (CSM) --- niz Shadow Map-ova razlicite rezolucije koji pokrivaju razlicita rastojanja od kamere. Tipicno se koriste 3--4 kaskade. Svaka kaskada je zasebni Shadow Map, sto znaci da Directional Light sa 4 kaskade zahteva 4 Shadow Map renderovanja.
Kamera -----> [Kaskada 1: 0-10m] [Kaskada 2: 10-30m] [Kaskada 3: 30-100m] [Kaskada 4: 100-300m]
Visoka rez. Srednja rez. Niska rez. Vrlo niska rez.
Spot Light (1 Shadow Map)
Spot Light zahteva samo 1 Shadow Map jer svetlost ide u jednom smeru. Ovo ga cini najefikasnijim dinamickim svetlom za bacanje senki.
Point Light (6 Shadow Map-ova!)
Point Light je daleko najskuplji tip svetla za senke. Posto svetlost ide u svim pravcima, GPU mora da renderuje 6 Shadow Map-ova --- po jedan za svaku stranu kocke (Cube Map). To znaci da je jedan Point Light sa senkama ekvivalentan po ceni sest Spot Light-ova sa senkama.
[Gore]
|
[Levo] -- [Centar] -- [Desno]
|
[Dole]
|
[Napred] [Nazad]
Point Light = 6 Shadow Map renderovanja (cubemap faces)
Spot Light = 1 Shadow Map renderovanje
Zlatno pravilo: Ako vam treba dinamicko svetlo sa senkama unutar prostorije, koristite Spot Light umesto Point Light-a kad god je moguce. Cak i dva Spot Light-a usmerena u suprotnim pravcima su jeftinija od jednog Point Light-a (2 Shadow Map-a vs 6).
Prakticni Budzet za Senke
Na osnovu iskustva i benchmarkinga, evo okvirnih preporuka za broj svetala koja bacaju senke:
| Platforma | Max Shadow-Casting Lights | Napomena |
|---|---|---|
| High-End PC (RTX 4080+) | 8--12 | Uz VSM, moze i vise sa dobrim cache-iranjem |
| Mid-Range PC (RTX 3060) | 4--6 | Pazljivo sa Point Light-ovima |
| Current-Gen Console (PS5/XSX) | 4--8 | Zavisno od ostatka scene |
| Last-Gen Console (PS4/XB1) | 2--3 | Koristite baked senke |
| VR (Quest 3) | 1--2 | Jedan Directional + eventualno 1 Spot |
| Mobile | 0--1 | Koristite baked senke skoro iskljucivo |
Ove brojke se odnose na istovremeno vidljiva svetla koja bacaju senke. Mozete imati i vise svetala u sceni, ali treba paziti da se ne vide sva istovremeno.
Strategije za Upravljanje Shadow Budzetom
-
Prioritetni sistem: Odredite koja svetla su najvaznija za vizuelni kvalitet i dozvolite samo njima da bacaju senke. Tipicno, to su Directional Light (sunce/mesec) i 1--2 kljucna svetla u blizini kamere.
-
Distance-Based Shadow Culling: Iskljucite senke za svetla koja su daleko od kamere. U Blueprint-u ili C++ kodu mozete dinamicki ukljucivati/iskljucivati Cast Shadows na osnovu rastojanja.
-
Shadow Importance Volume: Koristite ove volume da oznacite oblasti gde su senke vazne. Van ovih volumena, engine moze da smanji kvalitet ili potpuno iskljuci senke.
-
Per-Object Shadow Settings: Ne mora svaki objekat da baca senke. Mali objekti (case, olovke, dugmad) mogu imati iskljucen Cast Shadow bez primetne razlike u kvalitetu.
48.4 Optimizacija Lumen-a
Lumen je revolucionarni sistem za globalno osvetljenje i refleksije u Unreal Engine 5 (detaljno obradjen u Poglavlju 25). Medjutim, ta revolucija ima svoju cenu. U ovoj sekciji cemo proci kroz sve kljucne parametre koji uticu na performanse Lumen-a i kako ih podesiti.
48.4.1 Software vs Hardware Ray Tracing
Lumen moze da radi u dva rezima:
Software Ray Tracing (podrazumevano)
- Koristi Signed Distance Fields (SDF) za trazenje zraka.
- Radi na svim GPU-ovima koji podrzavaju SM5+ (DirectX 11 class).
- Nize opterecenje memorije.
- Manja preciznost --- ne moze da uhvati fine detalje geometrije.
- Nema podršku za deformabilne (Skeletal) mesheve u tracingu.
Hardware Ray Tracing
- Koristi RT jezgra na GPU-u (NVIDIA RTX, AMD RDNA2+).
- Preciznije traganje zraka --- koristi pravu geometriju umesto SDF aproksimacije.
- Podrska za Skeletal Mesh-eve i deformabilnu geometriju.
- Znacajno skuplje --- moze koristiti 30--50% vise GPU vremena nego Software tracing.
- Zahteva BLAS (Bottom-Level Acceleration Structure) odrzavanje, sto kosta i CPU i GPU vreme.
Preporuka: Koristite Hardware Ray Tracing samo ako:
- Ciljate high-end PC ili current-gen konzole.
- Vasa scena ima mnogo Skeletal Mesh-eva koji treba da uticu na GI.
- Imate fine geometrijske detalje koji SDF ne moze da reprodukuje.
- Imate dovoljno GPU budzeta (proverite sa
stat GPUi ProfileGPU).
Za vecinu projekata, Software Ray Tracing je preporuceni rezim jer pruza dobar odnos kvaliteta i performansi.
48.4.2 Lumen Scene Detail
Ovaj parametar (u Project Settings > Rendering > Global Illumination) kontrolise koliko detaljno Lumen reprezentuje vasu scenu za potrebe ray tracinga.
- Vrednosti: 0.5 (nizak detalj) do 4.0 (visok detalj). Podrazumevano: 1.0.
- Uticaj: Visa vrednost znaci da ce manji objekti biti ukljuceni u Lumen Scene, sto poboljsava kvalitet GI ali povecava memoriju i cenu tracinga.
- Optimizacija: Za velike spoljasnje scene, smanjite na 0.5--0.75. Za unutrasnje scene sa mnogo malih objekata koji uticu na osvetljenje, ostavite na 1.0 ili povecajte.
// Konzolna varijabla za runtime podesavanje
r.LumenScene.Detail 0.75
48.4.3 Detail Tracing Distance (Rastojanje Detaljnog Trasiranja)
Ovo je jedan od najuticajnijih parametara za performanse Lumen-a. Kontrolise do koje udaljenosti od kamere Lumen koristi detaljno trasiranje zraka.
- Podrazumevana vrednost: Zavisi od verzije engine-a, obicno oko 4000--5000 unita (~40--50 metara).
- Uticaj na performanse: Smanjenje ove vrednosti moze doneti 20--40% poboljsanja u Lumen GPU vremenu.
- Vizuelni kompromis: Objekti van ove udaljenosti koriste manje precizno trasiranje (Voxel Global Illumination fallback), sto moze dovesti do "svetlucanja" (flickering) ili manje preciznog GI na daljim objektima.
// Smanjite za bolje performanse u velikim scenama
r.Lumen.TracingDetail.MaxTraceDistance 3000
// Za VR ili performance-critical aplikacije
r.Lumen.TracingDetail.MaxTraceDistance 2000
Prakticni savet: Pocnite sa podrazumevanom vrednoscu, zatim postepeno smanjujte dok gledate scenu iz razlicitih uglova. Obicno mozete smanjiti za 30--40% bez primetnog gubitka kvaliteta, posebno u scenama sa mnogo geometrije koja zaklanja pogled na daleke objekte.
48.4.4 Final Gather Quality
Final Gather je zavrsni korak u Lumen pipeline-u koji sakuplja osvetljenje iz razlicitih izvora i kombinuje ih u konacnu sliku globalnog osvetljenja. Kvalitet ovog koraka direktno utice na:
- Smanjenje suma (noise) u GI --- visi kvalitet = manje suma.
- Preciznost osveljenja u uglovima i malim prostorima.
- Brzinu konvergencije --- koliko brzo GI "dolazi" do stabilne slike kada se nesto promeni.
Parametri Final Gather-a:
r.Lumen.ScreenProbeGather.TracesPerProbe // Broj zraka po probi
// Podrazumevano: 32
// Za optimizaciju: 16
// Za visok kvalitet: 64
r.Lumen.ScreenProbeGather.ScreenSpaceScale // Skala screen-space proba
// Podrazumevano: 1.0
// Za optimizaciju: 1.5 (manje proba)
// Za visok kvalitet: 0.75 (vise proba)
Efekat na performanse:
| Podesavanje | Traces Per Probe | Screen Space Scale | Relativna Cena |
|---|---|---|---|
| Low (Optimizovano) | 16 | 1.5 | ~40% baseline |
| Medium (Podrazumevano) | 32 | 1.0 | 100% (baseline) |
| High (Kvalitet) | 64 | 0.75 | ~250% baseline |
| Epic (Maximum) | 128 | 0.5 | ~600% baseline |
Kao sto vidite, razlika izmedju Low i Epic podesavanja moze biti ogromna --- do 15x razlike u ceni! Za vecinu igara, Medium podesavanje je sasvim dovoljno. Low je prihvatljiv za VR i performanse-kriticne aplikacije.
48.4.5 Lumen Scene Lighting Quality
Ovaj parametar kontrolise koliko precizno Lumen izracunava direktno osvetljenje u svojoj internoj reprezentaciji scene.
- Podrazumevana vrednost: 1.0
- Opseg: 0.25 do 4.0
- Uticaj: Visa vrednost poboljsava kvalitet senki u GI i preciznost odbijenog svetla, ali povecava cenu.
r.LumenScene.Lighting.Quality 0.75 // Za optimizaciju
r.LumenScene.Lighting.Quality 1.0 // Podrazumevano
r.LumenScene.Lighting.Quality 2.0 // Za cinematice
Preporuka: Za igre, vrednost od 0.75--1.0 je obicno dovoljna. Povecavajte samo za cinematicke sekvence ili ako primetite artefakte u odbijenom osvetljenju.
48.4.6 Lumen Reflections
Lumen takode obezbedjuje refleksije u realnom vremenu. Cena refleksija moze biti znacajna:
- Reflection Quality kontrolise rezoluciju i broj uzorkovanja za refleksije.
- Max Reflection Bounces --- koliko puta se zrak odbija za refleksije (podrazumevano 1, povecanje na 2+ je skupo).
- Za povrsine sa niskim Roughness-om (ogledala, polirani metali), refleksije su vidljivije i vise ih primetite ako su niskog kvaliteta.
r.Lumen.Reflections.Quality 0.5 // Brze, sa vise suma
r.Lumen.Reflections.Quality 1.0 // Podrazumevano
r.Lumen.Reflections.MaxBounces 1 // Podrazumevano, jedno odbijanje
48.4.7 Lumen Scalability Pregled
Evo kompletnog pregleda preporucenih podesavanja po platformi:
| Parametar | Mobile/VR | Console | PC Medium | PC Ultra |
|---|---|---|---|---|
| GI Method | Ne koristiti | Lumen SW | Lumen SW | Lumen HW |
| Scene Detail | -- | 0.75 | 1.0 | 1.5 |
| Detail Trace Dist. | -- | 2500 | 4000 | 6000 |
| Final Gather TracesPerProbe | -- | 16 | 32 | 64 |
| Screen Space Scale | -- | 1.5 | 1.0 | 0.75 |
| Lighting Quality | -- | 0.5 | 1.0 | 1.5 |
| Reflection Quality | -- | 0.5 | 1.0 | 1.5 |
48.5 Baked Lighting vs Lumen --- Kada Koristiti Sta
Pregled Opcija
Unreal Engine 5 nudi tri osnovna pristupa osvetljenju:
- Potpuno dinamicko (Lumen) --- sve se racuna u realnom vremenu.
- Potpuno baked (Lightmaps) --- sve se preracuna unapred i cuva u teksturama.
- Hibridno --- kombinacija baked i dinamickog osvetljenja.
Svaki pristup ima svoje prednosti i mane.
Potpuno Dinamicko (Lumen)
Prednosti:
- Nema potrebe za build-ovanjem svetla (nema cekanja na Lightmass).
- Sve promene su vidljive odmah.
- Podrska za potpuno dinamicke scene (dan/noc ciklus, promenljivo vreme).
- Nema UV Lightmap-a --- ne morate brinuti o Lightmap UV-ovima.
- Nema memorijskog trosenja na Lightmap teksture.
Mane:
- Visoka cena za GPU u realnom vremenu.
- Moze imati vidljiv sum (noise), posebno pri niskim kvalitetnim podesavanjima.
- Nije dostupno na mobilnim platformama.
- Zahteva minimum SM5 GPU.
Idealno za: PC igre, current-gen konzole, projekti sa dinamickim osvetljenjem.
Potpuno Baked (Lightmaps)
Prednosti:
- Izuzetno jeftino u runtime-u --- osvetljenje je samo tekstura koja se uzorkuje.
- Savrseni, meki GI bez suma.
- Radi na svim platformama, ukljucujuci mobilne.
- Predvidljive performanse.
Mane:
- Dugo vreme build-a svetla (moze trajati satima za slozene scene).
- Zauzima memoriju za Lightmap teksture (moze biti znacajno za velike scene).
- Ne podrzava dinamicke promene --- ako se svetlo pomeri, Lightmap je nevazeai.
- Zahteva pazljivo podesavanje Lightmap UV-ova.
- Samo Static i Stationary svetla mogu koristiti Lightmaps.
Idealno za: Mobilne igre, VR, arhitektonske vizualizacije sa fiksnim osvetljenjem.
Hibridni Pristup
U praksi, vecina projekata koristi kombinaciju:
- Baked GI za ambijentalno osvetljenje (Indirect Lighting).
- Dinamicke senke za glavno svetlo (Directional Light sa CSM).
- Stationary svetla za kljucna svetla --- baked Indirect, dinamicke senke.
- Movable svetla samo za svetla koja se zaista pomeraju (baklje, projektili, vozila).
Tabela Odlucivanja
Koristite ovu tabelu da odredite koji pristup je najbolji za vas projekat:
START
|
+--> Da li ciljna platforma podrzava Lumen?
|
+-- NE --> Koristite Baked Lighting (Lightmass)
|
+-- DA --> Da li vam treba dinamicko osvetljenje?
|
+-- NE --> Razmotrite Baked za bolje performanse
|
+-- DA --> Da li je performans kriticna?
|
+-- DA --> Hibridni pristup
| (Baked GI + Dinamicke senke)
|
+-- NE --> Potpuno dinamicko (Lumen)
Posebni Slucajevi
VR Projekti
VR zahteva konstantnih 90 FPS (ili 72 FPS na Quest-u) sa dva renderovanja (jedno za svako oko). To znaci da imate otprilike polovinu GPU budzeta u poredjenju sa obicnim desktop renderovanjem.
Za VR projekte:
- Koristite Forward Rendering (manji overhead).
- Koristite baked lighting za vecinu osvetljenja.
- Ogranicite se na 1 Directional Light sa dinamickim senkama.
- Koristite SSAO umesto Lumen AO.
- Razmotrite Light Probes za dinamicke objekte.
Mobile Projekti
Na mobilnim platformama, Lumen nije dostupan. Koristite:
- Lightmaps za staticko osvetljenje.
- Movable Directional Light sa ogranicenim CSM (1--2 kaskade).
- Baked Skylight za ambijentalno osvetljenje.
- Maksimalno 4 dinamicka svetla vidljiva istovremeno.
Arhitektonske Vizualizacije
Za archviz projekte gde je kvalitet osvetljenja od primarnog znacaja:
- Koristite Lumen na high-end hardveru.
- Postavite visoke kvalitetne parametre (Scene Detail 2.0+, Lighting Quality 2.0+).
- Koristite Hardware Ray Tracing za precizne refleksije.
- Ako klijent zahteva walkthrough na slabijim masinama, pripremite baked verziju.
48.6 Optimizacija Senki
48.6.1 Virtual Shadow Maps (VSM) i Cache Efikasnost
Virtual Shadow Maps (detaljno objasnjeni u Poglavlju 31) su sistem za senke u UE5 koji zamenjuje tradicionalne Shadow Maps jednom velikom virtualnom teksturom. Kljucna prednost VSM-a je cache-iranje --- delovi Shadow Map-a koji se ne menjaju ne moraju da se ponovo renderuju.
Kako VSM Cache Radi
VSM deli Shadow Map u male "page"-ove (stranice). Svaka stranica se renderuje nezavisno i cuva u cache-u. Kada se nista ne promeni u delu scene koji ta stranica pokriva, stranica se ponovo koristi iz cache-a bez ponovnog renderovanja.
VSM Virtual Texture:
+---+---+---+---+---+---+
| C | C | C | D | C | C | C = Cached (besplatno)
+---+---+---+---+---+---+ D = Dirty (mora se ponovo renderovati)
| C | C | D | D | C | C |
+---+---+---+---+---+---+ U ovom primeru, samo 4 od 24 stranice
| C | C | D | D | C | C | moraju da se ponovo renderuju.
+---+---+---+---+---+---+
| C | C | C | C | C | C | To je ušteda od ~83%!
+---+---+---+---+---+---+
Static vs Dynamic Objekti
Efikasnost VSM cache-a direktno zavisi od toga koliko objekata u vasoj sceni su staticni:
- Static objekti (Static Mobility) --- nikada ne invalidiraju cache. Jednom renderovani, njihove senke se koriste besplatno.
- Stationary objekti --- slicno Static-ima, ali mogu da se ukljuce/iskljuce.
- Movable objekti --- svako pomeranje invalidira stranice cache-a koje pokrivaju, prisiljavajuci GPU da ih ponovo renderuje.
Kljucna optimizacija: Sto vise objekata u vasoj sceni mozete oznaciti kao Static, to ce VSM cache biti efikasniji. U tipicnoj sceni:
- Zgrade, tereni, veliki rekviziti --- Static Mobility.
- Vrata, prozori koji se otvaraju --- Stationary (Static dok su zatvoreni, invalidiraju cache samo kad se pokrenu).
- Karakteri, vozila, projektili --- Movable (neizbezno).
- Mali dekorativni objekti (koji se ne pomeraju) --- Static Mobility!
Cesta greska: Mnogi pocetnici ostavljaju sve objekte kao Movable "za svaki slucaj". Ovo unistava VSM cache efikasnost i moze znacajno usporiti renderovanje senki. Uvek postavite Mobility na Static osim ako objekat zaista treba da se pomera.
VSM Konzolne Varijable za Optimizaciju
// Velicina stranice VSM-a (u pikselima)
r.Shadow.Virtual.PageSize 128 // Podrazumevano: 128
// Manji = vise granularan cache, vise overhead-a
// Veci = manje granularan, ali manji overhead
// Maksimalan broj fizickih stranica u memoriji
r.Shadow.Virtual.MaxPhysicalPages 2048 // Podrazumevano: 2048
// Smanjite za uštedu VRAM-a
// Povecajte ako imate thrashing
// Prikaz VSM statistike
r.Shadow.Virtual.ShowStats 1 // Prikazuje cache hit/miss statistiku
48.6.2 Shadow Distance (Rastojanje Senki)
Jedno od najjednostavnijih ali najefikasnijih optimizacija je smanjenje rastojanja na kome se senke renderuju. Senke na velikim rastojanjima su:
- Manje vidljive --- na velikoj udaljenosti, detalji senki se gube.
- Manje vazne --- igrac obicno ne gleda i ne primecuje senke na 500+ metara.
- Skupe --- pokrivaju veliku oblast Shadow Map-a, sto zahteva ili vise rezolucije ili vise kaskada.
Podesavanje Shadow Distance-a
// Maksimalno rastojanje za dinamicke senke
r.Shadow.DistanceScale 1.0 // Multiplikator (0.5 = pola rastojanja)
r.Shadow.CSM.MaxCascades 4 // Broj CSM kaskada (1-4)
// Per-light podesavanje u Details panelu:
// Dynamic Shadow Distance (Movable Light) --- specificno za svako svetlo
Za Directional Light (sunce), tipicna CSM podesavanja:
| Podesavanje | Cascade 1 | Cascade 2 | Cascade 3 | Cascade 4 | Ukupna Dist. |
|---|---|---|---|---|---|
| Aggressive | 5m | 15m | 40m | -- | 40m |
| Balanced | 10m | 30m | 80m | 200m | 200m |
| Quality | 15m | 50m | 150m | 500m | 500m |
Savet: Eksperimentiste sa "Aggressive" podesavanjem. Bice iznenadjeni koliko malo igraci primecuju nedostatak senki na 40+ metara, posebno ako imate ambijentalno osvetljenje (SSAO, Lumen AO) koje nadoknadjuje nedostatak dalekih senki.
48.6.3 Shadow Resolution (Rezolucija Senki)
Rezolucija Shadow Map-a direktno utice na kvalitet senki (ostrina ivica) ali i na cenu. Visa rezolucija znaci:
- Vise piksela za renderovanje u Shadow Map prolazu.
- Vise memorije za cuvanje Shadow Map teksture.
- Vise filtriranja u glavnom renderovanje prolazu.
// Globalna rezolucija senki
r.Shadow.MaxResolution 2048 // Podrazumevano: 2048
// Za optimizaciju: 1024
// Za kvalitet: 4096
// Za VSM, rezolucija se kontrolise drugacije:
r.Shadow.Virtual.ResolutionLodBiasDirectional 0 // 0 = puna rezolucija
// 1 = pola rezolucije
// -1 = dupla rezolucija
r.Shadow.Virtual.ResolutionLodBiasLocal 0 // Isto za lokalna svetla
48.6.4 Contact Shadows
Contact Shadows su screen-space efekat koji dodaje fine senke u kontaktu izmedju objekata (npr. gde noga dodiruje pod). Ukljucuju se per-light u Details panelu.
Cena Contact Shadows-a:
- Relativno niska u poredjenju sa punim Shadow Map-ovima.
- Izvrsavaju se kao full-screen pass za svako svetlo koje ih koristi.
- Cena raste sa brojem svetala koja koriste Contact Shadows.
- Zavise od broja koraka ray marching-a (podrazumevano 8--16).
// Podesavanje Contact Shadows
r.ContactShadows.EnableForLocalLights 1 // Ukljuci za lokalna svetla
r.ContactShadows.MaxRaySteps 16 // Koraci za ray marching
// Smanjite za performanse (8)
// Povecajte za kvalitet (32)
Preporuka: Koristite Contact Shadows samo na glavnom Directional Light-u. Ukljucivanje na svakom Point/Spot Light-u brzo postaje skupo i retko donosi vidljivo poboljsanje.
48.6.5 Point Light Shadow Cena --- Dublje Objasnjenje
Vratimo se na temu Point Light senki jer je to toliko vazna optimizacija da zasluzuje detaljnije objasnjenje.
Kada Point Light baca senke, GPU renderuje scenu sest puta --- jednom za svaku stranu Cube Map-a. Svako renderovanje je potpuni Shadow Map pass sa svom geometrijom unutar Attenuation Radius-a.
Uporedimo cenu:
Scenario A: 4 Point Light-a sa senkama
= 4 x 6 = 24 Shadow Map renderovanja
Scenario B: 4 Spot Light-a sa senkama (pokrivaju slicnu oblast)
= 4 x 1 = 4 Shadow Map renderovanja
Scenario B je 6x JEFTINIJE!
Ali cekajte --- Point Light daje svetlost u svim pravcima, dok Spot Light pokriva samo konus. Kako postici slican efekat?
Tehnika "Fake Point Light":
Umesto jednog Point Light-a, koristite 2 Spot Light-a usmerena u suprotnim pravcima sa sirokim uglom (Outer Cone Angle 89 stepeni). Ovo pokriva skoro istu oblast kao Point Light ali sa samo 2 Shadow Map renderovanja umesto 6.
Point Light: [6 Shadow Maps] ████████████████████████
2x Spot Light: [2 Shadow Maps] ████████
Usteda: ~67%
Naravno, ovo ne pokriva gore i dole, ali u vecini interijera, pod i plafon zaklanjaju pogled tako da senke u tim pravcima nisu vidljive.
Kada ipak koristiti Point Light sa senkama:
- Svetlo visi sa plafona i mora da baca senke u svim pravcima (lusteri).
- Svetlosni izvor je u sredini prostorije bez jasnog smera.
- Kvalitet je prioritet nad performansama (cinematics, archviz).
48.7 Prakticne Strategije Optimizacije
Sada kada razumemo teoriju, hajde da predjemo na konkretne, prakticne strategije koje mozete primeniti u vasem projektu vec danas.
48.7.1 Minimiziranje Preklapajucih Svetala
Korak 1: Audit vasih svetala
Otvorite vasu scenu i aktivirajte Light Complexity vizualizaciju. Proci kroz scenu i identifikujte "vruce tacke" --- oblasti gde se preklapaju mnoga svetla.
Korak 2: Smanjite Attenuation Radius
Za svako svetlo koje ste identifikovali:
- Selektujte svetlo.
- U Details panelu, pronadjite Attenuation Radius.
- Smanjujte postepeno dok svetlo i dalje izgleda prihvatljivo.
- Koristite Preview opciju da vidite efekat u realnom vremenu.
Prakticno pravilo za Attenuation Radius:
| Tip Svetla | Realni Ekvivalent | Preporuceni Attenuation Radius |
|---|---|---|
| Stolna lampa | 60W sijalica | 200--400 unita |
| Zidna svetiljka | Zidna lampa | 300--500 unita |
| Plafonsko svetlo | Plafonska lampa | 400--700 unita |
| Reflektor | Industrijski reflektor | 800--1500 unita |
| Ulicna svetiljka | Ulicni stub | 600--1000 unita |
| Baklja | Srednjovekovna baklja | 300--500 unita |
Korak 3: Uklonite nepotrebna svetla
Cesto se desi da u sceni postoje svetla koja su zaostala iz ranijih iteracija dizajna ili da vise svetala radi isti posao. Proci kroz scenu i uklonite svako svetlo koje ne doprinosi vizuelnom kvalitetu.
48.7.2 Iskljucivanje Senki na Sporednim Svetlima
Ne mora svako svetlo da baca senke. U vecini scena, samo 2--3 svetla treba da imaju ukljucene senke:
- Directional Light (sunce/mesec) --- uvek sa senkama.
- Kljucno svetlo scene --- jedno svetlo koje definise atmosferu (npr. reflektorska svetiljka u centru, kamin).
- Svetlo blizu kamere --- eventualno jos jedno svetlo u neposrednoj blizini igraca.
Sva ostala svetla --- dekorativna, ambijentalna, akcentna --- treba da imaju Cast Shadows = false.
// U Blueprint-u, dinamicki ukljucite/iskljucite senke
// na osnovu rastojanja od kamere
Event Tick:
Distance = GetDistanceTo(PlayerCamera)
IF Distance < 1500:
PointLight->SetCastShadows(true)
ELSE:
PointLight->SetCastShadows(false)
48.7.3 Koriscenje Static i Stationary Svetala
Podsetimo se tipova mobilnosti svetala (detaljno u Poglavlju 23):
- Static --- potpuno baked. Nulta cena u runtime-u za svetlo i senke. Ali se ne moze menjati.
- Stationary --- baked Indirect Lighting + dinamicke senke. Umeren trosak. Moze se menjati intenzitet i boja.
- Movable --- potpuno dinamicko. Najskuplje. Potpuna sloboda promene.
Strategija: Koristite najmanje dinamican tip koji zadovoljava vase potrebe:
| Svetlo se... | Preporuceni tip |
|---|---|
| ...nikada ne menja | Static |
| ...menja intenzitet/boju | Stationary |
| ...fizicki pomera | Movable |
| ...pali/gasi | Stationary (menja intenzitet na 0) |
| ...je vezano za pokretni objekat | Movable |
Napomena o Stationary limitima: Maksimalno 4 Stationary svetla mogu da se preklapaju na istoj povrsini. Ako se vise od 4 preklope, peto svetlo ce automatski biti tretirano kao Movable, sa crvenim X ikonom u editoru. Koristite Stationary Light Overlap vizualizaciju da proverite ovo.
48.7.4 Agresivno Koriscenje Attenuation Radius-a
Ponovicemo jer je toliko vazno: Attenuation Radius je vas najbolji prijatelj za optimizaciju svetla.
Svako smanjenje Attenuation Radius-a ima dva benefita:
- Manje piksela koje GPU mora da obradi za to svetlo.
- Manje preklapanja sa drugim svetlima.
Tehnika za pronalazenje optimalnog radijusa:
- Postavite svetlo na zeljenu poziciju sa zeljenim intenzitetom.
- Smanjujte Attenuation Radius dok ne primetite da se ivica svetla "sece" na vidljivom mestu.
- Povecajte za 10--15% od te tacke --- to je vas optimalni radijus.
48.7.5 Distance Culling za Svetla
Svetla koja su daleko od kamere ne moraju da se renderuju. Unreal Engine automatski radi neku vrstu culling-a, ali mozete ga pojacati:
// U Details panelu svetla:
// Max Draw Distance --- svetlo se ne renderuje ako je dalje od ove vrednosti
// Max Distance Fade Range --- postepeni fade-out pre potpunog culling-a
// Primer:
// Max Draw Distance: 5000
// Max Distance Fade Range: 1000
// Svetlo pocinje da bledi na 4000 unita i potpuno nestaje na 5000
Ovo je posebno korisno za scene sa mnogo malih svetala (npr. grad noci sa stotinama ulicnih svetiljki).
48.8 Light Channels --- Selektivno Osvetljenje
Sta su Light Channels?
Light Channels su sistem koji vam omogucava da kontrolisete koja svetla uticu na koje objekte. Svako svetlo i svaki mesh imaju podesavanje za 3 kanala (Channel 0, 1, 2). Svetlo ce osvetljavati mesh samo ako dele bar jedan zajednicki kanal.
Kako Koristiti Light Channels za Optimizaciju
Light Channels mogu znacajno smanjiti broj svetala koja uticu na svaki objekat:
Primer 1: Unutrasnja vs Spoljna Svetla
Channel 0 = Spoljna svetla (Sunce, Sky Light)
Channel 1 = Unutrasnja svetla (Sva svetla u zgradi)
Channel 2 = Specijalna svetla (Efekti, naglasci)
Spoljni objekti: Channel 0 ukljucen, Channel 1 iskljucen
Unutrasnji objekti: Channel 0 iskljucen, Channel 1 ukljucen
Objekti na granici (prozori, vrata): Channel 0 i 1 ukljuceni
Ovim spreocavate da unutrasnja svetla nepotrebno obradjuju spoljne objekte i obrnuto.
Primer 2: Osvetljenje Karaktera
U cinematics-ima, cesto zelite posebno svetlo samo za karakter (Character Light) koje ne utice na okolinu:
Character Light: Channel 2 only
Character Mesh: Channel 0 + Channel 2
Okolina: Channel 0 only
Rezultat: Character Light osvetljava samo karakter, ne i okolinu
Ogranicenja Light Channels
- Samo 3 kanala su dostupna (0, 1, 2).
- Light Channels ne uticu na indirektno osvetljenje (GI). Lumen i Lightmass ignorisu Light Channels.
- Light Channels uticu na senke --- ako svetlo ne osvetljava objekat zbog kanala, objekat nece ni bacati senku od tog svetla.
- Koriscenje Light Channels moze dovesti do vizuelno nekonzistentnog osvetljenja ako se ne koristi pazljivo.
Cena Light Channels
Dobra vest: Light Channels su prakticno besplatni u smislu performansi. Provera kanala je jednostavna bitwise AND operacija koja se desava pre nego sto GPU pocne da racuna osvetljenje. Ako se kanali ne poklapaju, svetlo se preskace za taj objekat --- sto je zapravo usteda u performansama.
48.9 Light Function Cena
Sta su Light Functions?
Light Functions su materijali koji se primenjuju na svetla da modifikuju njihov oblik, intenzitet ili boju. Tipicni primeri:
- Simulacija svetla kroz zastore (Gobo Light).
- Treperenje svetla (Flickering).
- Projektovanje uzoraka (Patterned Light).
- Simulacija oblaka koji prolaze ispred sunca.
Cena Light Functions
Light Functions dodaju shader instrukcije za svaki piksel koji je osvetljen tim svetlom. Cena zavisi od slozenosti materijala:
| Slozenost Light Function | Relativna Cena | Primer |
|---|---|---|
| Jednostavna (1--2 noda) | Minimalna (+5--10%) | Jednostavan gradient |
| Umerena (5--10 nodova) | Primetna (+15--25%) | Gobo sa teksturom |
| Slozcna (15+ nodova) | Znacajna (+30--50%) | Animirana proceduralna tekstura |
Optimizacija Light Functions
- Koristite teksture umesto proceduralnih nodova --- uzorkovanje teksture je obicno jeftnije od proceduralnog generisanja.
- Smanjite rezoluciju Light Function teksture --- posto se Light Function primenjuje na svetlo (ne na povrsinu), niža rezolucija (256x256 ili cak 128x128) je obicno dovoljna.
- Izbegavajte animirane Light Functions na vise svetala --- ako imate 10 svetala sa istom flickering Light Function, razmotrite da li mozete postici isti efekat sa manje svetala.
- Koristite Light Function samo na vidljivim svetlima --- kombinujte sa Distance Culling.
// Primer jednostavne Light Function za Gobo efekat:
// Material Domain: Light Function
// Blend Mode: Opaque
TextureSample(GoboTexture, UV) --> Multiply(Intensity) --> Output
48.10 Napredne Tehnike Optimizacije
48.10.1 Level of Detail (LOD) za Svetla
Iako Unreal Engine nema ugradjen LOD sistem za svetla kao sto ima za mesheve, mozete implementirati sopstveni:
// Blueprint logika za Light LOD
Rastojanje od kamere:
< 500 unita: Puna cena (senke, Light Function, visoka rezolucija)
500--2000: Bez Light Function, smanjene senke
2000--5000: Bez senki, smanjen Attenuation Radius
> 5000: Svetlo iskljuceno (ili zamenjeno emissive materijalom)
Ovo je posebno korisno za otvorene svetove sa stotinama svetlosnih izvora.
48.10.2 Emissive Materijali kao Zamena za Svetla
U mnogim slucajevima, svetlosni izvor ne mora da bude pravo svetlo. Emissive materijali mogu vizuelno simulirati izvor svetla bez ikakve cene za osvetljenje:
- Svetleci znakovi (neon, LED).
- Ekrani i monitori.
- Dekorativna svetla na velikim rastojanjima.
Kada se Lumen koristi, Emissive materijali cak i doprinose globalnom osvetljenju jer Lumen uzima u obzir Emissive povrsine kao izvore svetla.
// Tehnika: Emissive + Point Light za blizinu
IF Distance < 1500:
Show Point Light // Pravo svetlo za blizinu
Emissive Intensity = 10
ELSE:
Hide Point Light // Samo emissive materijal za daljinu
Emissive Intensity = 20 // Povecajte malo da kompenzujete
48.10.3 Light Merging
Ako imate grupu svetala iste boje i intenziteta blizu jednih drugih (npr. niz plafonskih svetala), razmotrite da ih spojite u jedno vece svetlo. Ovo drasticno smanjuje broj svetala ali zahteva pazljivo podesavanje da rezultat izgleda uverljivo.
Pre optimizacije:
10 Point Light-ova, svaki Intensity 5000, Radius 400
= 10 svetala, potencijalno preklapanje
Posle optimizacije:
2 Rect Light-a ili Point Light-a, Intensity 15000, Radius 1000
= 2 svetla, manje preklapanja, slican vizuelni rezultat
48.10.4 Volumetric Fog i Svetla
Volumetric Fog (volumetrijska magla) dodaje znacajnu cenu svakom svetlu koje doprinosi magli. Svako svetlo sa ukljucenim Volumetric Scattering Intensity > 0 zahteva dodatno racunanje za volumetrijske efekte.
Optimizacija:
- Postavite Volumetric Scattering Intensity na 0 za svetla koja ne moraju da doprinose magli.
- Smanjite gustinu volumetrickog grida (r.VolumetricFog.GridPixelSize).
- Ogranicite rastojanje volumetrijske magle (r.VolumetricFog.Distance).
48.11 Profajliranje i Merenje Performansi Svetla
Alati za Profajliranje
Nista od gore navedenog nema smisla ako ne merite rezultate. Evo alata koje treba koristiti:
stat GPU
// U konzoli:
stat GPU
Prikazuje vreme koje GPU trosi na svaki prolaz renderinga:
- Lights --- ukupno vreme za obradu svetala.
- Shadow Depths --- vreme za renderovanje Shadow Map-ova.
- Shadow Projection --- vreme za projiciranje senki na scenu.
- Lumen Scene --- vreme za Lumen Scene update.
- Lumen Reflections --- vreme za Lumen refleksije.
ProfileGPU
// U konzoli ili Ctrl+Shift+, u editoru:
ProfileGPU
Daje detaljniji, hijerarhijski prikaz. Mozete videti tacno koliko svako pojedinacno svetlo kosta.
Unreal Insights
Za dublje profajliranje, koristite Unreal Insights (Trace system). Omogucava snimanje profila tokom vise frejmova i analizu trendova.
Ciljne Vrednosti
Evo okvirnih ciljnih vrednosti za GPU vreme svetla i senki:
| Kategorija | 30 FPS Budzet | 60 FPS Budzet | 90 FPS (VR) Budzet |
|---|---|---|---|
| Ukupno za frejm | 33.3 ms | 16.6 ms | 11.1 ms |
| Svetla (sve) | 6--8 ms | 3--4 ms | 1.5--2 ms |
| Shadow Depths | 3--4 ms | 1.5--2 ms | 0.5--1 ms |
| Shadow Projection | 1--2 ms | 0.5--1 ms | 0.3--0.5 ms |
| Lumen GI | 3--5 ms | 2--3 ms | N/A (ne koristite) |
| Lumen Reflections | 2--3 ms | 1--1.5 ms | N/A |
Ako bilo koja kategorija prelazi ove vrednosti, to je signal za optimizaciju.
Metodologija Optimizacije
- Merite --- snimite baseline performanse pre bilo kakvih promena.
- Identifikujte --- koristite profajlere da nadjete najskuplje svetlo/senku.
- Promenite --- primenite jednu optimizaciju.
- Merite ponovo --- proverite da li je promena donela poboljsanje.
- Ponovite --- nastavite dok ne dostignete ciljne vrednosti.
Vazno: Nemojte optimizovati "naslepo". Uvek merite pre i posle svake promene. Ponekad promena koja zvuci kao da bi trebalo da pomogne zapravo nema merljiv efekat.
48.12 Checklist za Optimizaciju Svetla i Senki
Pre finalnog build-a vaseg projekta, prodjite kroz ovu listu:
Svetla --- Opste
- Proverite Light Complexity vizualizaciju --- da li postoje crvene zone?
- Da li je Attenuation Radius svakog svetla minimizovan?
- Da li postoje nepotrebna svetla koja mozete ukloniti?
- Da li sva svetla imaju odgovarajuci Mobility (Static > Stationary > Movable)?
- Da li koristite Distance Culling za svetla?
Senke
- Da li samo najvaznija svetla bacaju senke?
- Da li su Shadow Map rezolucije optimizovane?
- Da li ste smanjili Shadow Distance na minimum?
- Da li izbegavate Point Light senke gde je moguce?
- Da li su Contact Shadows ukljuceni samo na glavnom svetlu?
- Da li su vasi staticni objekti oznaceni kao Static Mobility (za VSM cache)?
Lumen
- Da li koristite Software ili Hardware tracing (i zasto)?
- Da li je Detail Trace Distance optimizovan?
- Da li su Final Gather parametri prilagodjeni ciljnoj platformi?
- Da li je Lumen Scene Detail podeshen za vasu scenu?
- Da li Lumen Reflection Quality odgovara vasim potrebama?
Light Channels i Funkcije
- Da li koristite Light Channels za selektivno osvetljenje?
- Da li su Light Functions jednostavne i koriste se ustedljivo?
- Da li su Volumetric Scattering podscavanja optimizovana?
48.13 Primeri iz Prakse --- Studije Slucaja
Studija Slucaja 1: Unutrasnji Prostor --- Restoran
Pocetno stanje:
- 30 svetala (mesavina Point i Spot Light-ova).
- Sva bacaju senke.
- Attenuation Radius podrazumevani (1000 za sve).
- GPU Lights vreme: 12.5 ms (neprihvatljivo za 60 FPS).
Optimizacije primenjene:
-
Smanjeni Attenuation Radius-i:
- Stolne lampe: 1000 --> 300 unita.
- Plafonska svetla: 1000 --> 600 unita.
- Dekorativna svetla: 1000 --> 250 unita.
-
Senke iskljucene na 25 od 30 svetala. Samo zadrzane na:
- 1 Directional Light (prozori).
- 2 kljucna plafonska svetla.
- 1 Spot Light na sanku.
- 1 Spot Light na ulazu.
-
20 plafonskih svetala pretvoreno u Stationary.
-
Light Channels: spoljna svetla na Channel 0, unutrasnja na Channel 1.
Rezultat: GPU Lights vreme: 3.2 ms --- poboljsanje od 74%!
Studija Slucaja 2: Otvoreni Svet --- Grad Nocu
Pocetno stanje:
- 200+ ulicnih svetiljki (Point Light, Movable, svi sa senkama).
- Lumen ukljucen sa podrazumevanim podesavanjima.
- GPU vreme za svetla: premasuje budzet za 8+ ms.
Optimizacije primenjene:
-
Implementiran Light LOD sistem:
- Blizu kamere (< 50m): puno svetlo sa senkama.
- Srednje rastojanje (50--150m): svetlo bez senki.
- Daleko (150--300m): samo emissive materijal + smanjen Point Light.
- Vrlo daleko (> 300m): samo emissive materijal.
-
Ulicna svetla pretvorena u Spot Light (usmerena dole) umesto Point Light.
-
Smanjeni Attenuation Radius-i na 600 unita (ulicna svetla realisticno ne dopiru daleko).
-
Lumen optimizacija:
- Detail Trace Distance: 5000 --> 2500.
- Final Gather TracesPerProbe: 32 --> 20.
- Screen Space Scale: 1.0 --> 1.25.
-
Implementiran Distance Culling: Max Draw Distance 300m sa 50m fade range.
Rezultat: Stabilan framerate na ciljnom hardveru sa vizuelnim kvalitetom koji je prakticno nepromenjen.
Studija Slucaja 3: VR Iskustvo --- Muzejska Postavka
Zahtevi:
- Konstantnih 90 FPS na Meta Quest 3 (standalone).
- Visok vizuelni kvalitet za muzejske eksponate.
Pristup:
- Forward Rendering aktiviran.
- Lumen iskljucen --- koriscene Lightmaps za GI.
- Jedno Directional Light (Stationary) sa 2 CSM kaskade (max 15m).
- Baked Skylight za ambijentalno osvetljenje.
- Eksponati osvetljeni Spot Light-ovima (Stationary, baked senke).
- Ukupno samo 2 Movable svetla u celoj sceni (interaktivna baterijska lampa igraca i jedno akcentno svetlo).
- Lightmap rezolucija maksimizovana za kljucne eksponate (64--128 texels/m), minimizovana za zidove i podove (4--8 texels/m).
Rezultat: Stabilan 90 FPS sa vizuelnim kvalitetom uporedivim sa desktop renderovanjem zahvaljujuci visokorekvalitetnim Lightmaps.
48.14 Ceste Greske i Kako Ih Izbeci
Greska 1: "Svako Svetlo Mora da Baca Senke"
Realnost: U vecini scena, samo 10--20% svetala treba da baca senke. Ljudski vizuelni sistem je izuzetno tolerantan na nedostatak senki od sporednih izvora svetla. Igraci nece primetiti da dekorativna zidna svetiljka ne baca senku, ali hoce primetiti pad framerate-a.
Greska 2: "Veci Attenuation Radius = Lepse Svetlo"
Realnost: Veci radijus znaci samo da svetlo dopire dalje, ali uz isti intenzitet svetlo postaje slabije na vecim rastojanjima (Inverse Square Falloff). Rezultat je cesto jedva vidljivo svetlo na rubovima radijusa koje i dalje kosta GPU vreme. Smanjite radijus na oblast gde svetlo zaista doprinosi vizuelnom kvalitetu.
Greska 3: "Sve Mora Biti Movable za Fleksibilnost"
Realnost: Static i Stationary svetla su dramaticno jeftinija. Koristite Movable samo za svetla koja se zaista pomeraju tokom igre. Cak i svetla koja se pale/gase mogu biti Stationary (menjajte intenzitet umesto da pomerite svetlo).
Greska 4: "Lumen Resava Sve"
Realnost: Lumen je izuzetan sistem, ali ima svoju cenu. Na slabijim platformama, baked lighting i dalje daje bolje rezultate po performansnom dolaru. Ne forsrajte Lumen na platformi koja ne moze da ga podrzi.
Greska 5: "Optimizaciju Cu Raditi na Kraju"
Realnost: Optimizacija svetla treba da bude kontinualan proces. Ako sacekate kraj projekta, mozda cete morati da preradite znacajan deo scene. Redovno proveravajte Light Complexity i GPU profajler.
48.15 Rezime Poglavlja
U ovom poglavlju smo prosli kroz sve kljucne aspekte optimizacije svetla i senki u Unreal Engine 5:
- Light Complexity --- razumevanje koliko svetala utice na svaki piksel i zasto je preklapanje problem.
- Preklapajuca svetla --- svako dodatno svetlo dodaje kompletnu shader evaluaciju.
- Shadow budzetiranje --- senke su najskuplji aspekt, posebno Point Light senke (6 Shadow Map-ova).
- Lumen optimizacija --- Detail Trace Distance, Final Gather Quality, Scene Detail i Lighting Quality.
- Baked vs Dinamicko --- kada koristiti koji pristup.
- VSM cache --- Static objekti = besplatne senke iz cache-a.
- Contact Shadows --- koristiti ustedljivo.
- Prakticne strategije --- minimiziranje preklapanja, Distance Culling, Light LOD.
- Light Channels --- selektivno osvetljenje bez cene.
- Light Functions --- drzati jednostavne.
- Profajliranje --- uvek merite pre i posle optimizacije.
Zapamtite: optimizacija svetla nije jednokratan posao. To je kontinualan proces koji treba da bude deo vase razvojne prakse od pocetka projekta.
Tabela Kljucnih Pojmova
| Termin (EN) | Opis (SR) |
|---|---|
| Light Complexity | Vizualizacioni rezim koji pokazuje broj svetala po pikselu |
| Attenuation Radius | Radijus uticaja svetla --- pikseli van radijusa ne obradjuju se |
| Shadow Map | Tekstura dubine renderovana iz perspektive svetla za proracun senki |
| Cascaded Shadow Maps (CSM) | Niz Shadow Map-ova razlicite rezolucije za Directional Light |
| Virtual Shadow Maps (VSM) | UE5 sistem senki sa virtualnom teksturom i cache-iranjem |
| Shadow Map Cache | Mehanizam cuvanja neizmenjenih delova Shadow Map-a za ponovnu upotrebu |
| Lumen | UE5 sistem za dinamicko globalno osvetljenje i refleksije u realnom vremenu |
| Software Ray Tracing | Trasiranje zraka koristeci Signed Distance Fields (radi na svim GPU-ovima) |
| Hardware Ray Tracing | Trasiranje zraka koristeci RT jezgra na GPU-u (RTX, RDNA2+) |
| Detail Trace Distance | Rastojanje od kamere do kojeg Lumen koristi detaljno trasiranje |
| Final Gather | Zavrsni korak Lumen pipeline-a koji sakuplja i kombinuje osvetljenje |
| Screen Probes | Probe koje Lumen rasporeduje po ekranu za sakupljanje GI informacija |
| Signed Distance Field (SDF) | Matematicka reprezentacija geometrije za brzo trasiranje zraka |
| Light Channels | Sistem za kontrolu koji svetlosni izvori uticu na koje objekte (3 kanala) |
| Light Function | Materijal primenjen na svetlo za modifikaciju oblika/intenziteta/boje |
| Deferred Rendering | Rendering pristup gde se svetla obradjuju nakon geometrije (u posebnom prolazu) |
| Forward Rendering | Rendering pristup gde se svetla obradjuju zajedno sa geometrijom |
| Lightmaps | Preracunate teksture osvetljenja (baked lighting) |
| Emissive Material | Materijal koji emituje svetlost (vizuelno i za Lumen GI) |
| Contact Shadows | Screen-space efekat za fine senke u kontaktu izmedju objekata |
| BRDF | Bidirectional Reflectance Distribution Function --- matematicki model refleksije svetla |
| Inverse Square Falloff | Fizicki tacan model opadanja intenziteta svetla sa rastojanjem |
| G-Buffer | Skup tekstura koje cuvaju informacije o geometriji za Deferred Rendering |
| Volumetric Fog | Volumetrijska magla koja interaguje sa svetlom |
| Distance Culling | Iskljucivanje renderovanja objekata/svetala na osnovu udaljenosti od kamere |
| LOD (Level of Detail) | Tehnika smanjenja slozenosti na osnovu udaljenosti od kamere |
| ProfileGPU | UE5 alat za detaljno profajliranje GPU rada po rendering prolazima |
| Stationary Light | Svetlo koje ne menja poziciju ali moze menjati intenzitet i boju |
| Static Light | Potpuno preracunato svetlo bez cene u runtime-u |
| Movable Light | Potpuno dinamicko svetlo sa punom fleksibilnoscu ali i punom cenom |
| PCF (Percentage Closer Filtering) | Algoritam za glatkije ivice senki |
| Cube Map Shadow | Shadow Map za Point Light --- 6 strana kocke |
| IES Profile | Industrijski standard za opis distribucije svetlosti svetlosnih tela |
| Cache Hit/Miss | Pogodak/promasaj prilikom pretrage cache-a (relevantno za VSM) |
| BLAS | Bottom-Level Acceleration Structure --- struktura za Hardware Ray Tracing |
Reference i Dodatno Citanje
Poglavlja u Ovoj Knjizi
- Poglavlje 13: Senke u Unreal Engine-u --- Osnove tipova senki, Shadow Maps, kaskadne senke.
- Poglavlje 23: Tipovi Svetla --- Detaljan pregled svih tipova svetla (Directional, Point, Spot, Rect, Sky Light).
- Poglavlje 25: Lumen Globalno Osvetljenje --- Kako Lumen radi, podesavanja, vizuelni rezultati.
- Poglavlje 31: Virtual Shadow Maps --- Detaljan pregled VSM sistema, cache-iranje, podesavanja.
Zvanicna Dokumentacija (Epic Games)
- Unreal Engine 5 Documentation --- Lighting Overview: https://docs.unrealengine.com/5.0/en-US/lighting-overview-in-unreal-engine/
- Lumen Global Illumination and Reflections: https://docs.unrealengine.com/5.0/en-US/lumen-global-illumination-and-reflections-in-unreal-engine/
- Virtual Shadow Maps: https://docs.unrealengine.com/5.0/en-US/virtual-shadow-maps-in-unreal-engine/
- Lighting Best Practices: https://docs.unrealengine.com/5.0/en-US/lighting-best-practices-in-unreal-engine/
Epic Games Blog i Tech Talks
- "Lumen in UE5: Technical Deep Dive" --- Unreal Fest 2022 prezentacija.
- "Virtual Shadow Maps: A New Approach to Shadowing" --- GDC 2021.
- "Optimizing Lighting in Unreal Engine 5" --- Unreal Online Learning.
Akademski i Industrijski Resursi
- "Real-Time Rendering" (4th Edition) --- Tomas Akenine-Moller, Eric Haines, Naty Hoffman. Poglavlja o osvetljenju i senkama.
- "GPU Gems 3" --- NVIDIA, poglavlje o Shadow Mapping tehnikama.
- "Physically Based Rendering: From Theory to Implementation" (3rd Edition) --- Matt Pharr, Wenzel Jakob, Greg Humphreys. Za dublje razumevanje BRDF-a i ray tracing-a.
U sledecem poglavlju cemo se pozabaviti optimizacijom post-processing efekata i kako oni uticu na ukupne performanse vaseg projekta. Vidimo se tamo!