Poglavlje 48: Svetlo i Senke --- Optimizacija

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:

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:

  1. Odredi koja svetla uticu na taj piksel (na osnovu Attenuation Radius-a svetla i pozicije piksela).
  2. Izracuna doprinos svakog svetla --- to ukljucuje evaluaciju BRDF funkcije (Bidirectional Reflectance Distribution Function), proveru senki, primenu Light Function-a itd.
  3. 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:

  1. Izracunavanje rastojanja od piksela do svetla i primenu Attenuation funkcije (Inverse Square Falloff ili prilagodjena kriva).
  2. Evaluaciju BRDF-a --- Diffuse (Lambert ili Disney Diffuse) i Specular (GGX). Ovo je matematicki intenzivan korak.
  3. 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).
  4. Light Function evaluaciju --- ako svetlo koristi Light Function materijal.
  5. 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:

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:

  1. Smanjiti Attenuation Radius svakog plafonskog svetla tako da pokriva samo oblast ispod njega (recimo 400--600 unita umesto podrazumevanih 1000).
  2. Desk lampe postaviti kao Spot Light sa uskim uglom (Inner Cone Angle 20--30 stepeni) i malim Attenuation Radius-om (200--300 unita).
  3. Dekorativna svetla ne treba da bacaju senke --- iskljuciti Cast Shadows.
  4. Samo 2--3 najvaznija svetla treba da bacaju dinamicke senke.
  5. 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:

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:

  1. 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.
  2. 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.
  3. 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

  1. 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.

  2. 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.

  3. 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.

  4. 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)

Hardware Ray Tracing

Preporuka: Koristite Hardware Ray Tracing samo ako:

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.

// 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.

// 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:

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.

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:

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:

  1. Potpuno dinamicko (Lumen) --- sve se racuna u realnom vremenu.
  2. Potpuno baked (Lightmaps) --- sve se preracuna unapred i cuva u teksturama.
  3. Hibridno --- kombinacija baked i dinamickog osvetljenja.

Svaki pristup ima svoje prednosti i mane.

Potpuno Dinamicko (Lumen)

Prednosti:

Mane:

Idealno za: PC igre, current-gen konzole, projekti sa dinamickim osvetljenjem.

Potpuno Baked (Lightmaps)

Prednosti:

Mane:

Idealno za: Mobilne igre, VR, arhitektonske vizualizacije sa fiksnim osvetljenjem.

Hibridni Pristup

U praksi, vecina projekata koristi kombinaciju:

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:

Mobile Projekti

Na mobilnim platformama, Lumen nije dostupan. Koristite:

Arhitektonske Vizualizacije

Za archviz projekte gde je kvalitet osvetljenja od primarnog znacaja:


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:

Kljucna optimizacija: Sto vise objekata u vasoj sceni mozete oznaciti kao Static, to ce VSM cache biti efikasniji. U tipicnoj sceni:

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:

  1. Manje vidljive --- na velikoj udaljenosti, detalji senki se gube.
  2. Manje vazne --- igrac obicno ne gleda i ne primecuje senke na 500+ metara.
  3. 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:

// 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:

// 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:


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:

  1. Selektujte svetlo.
  2. U Details panelu, pronadjite Attenuation Radius.
  3. Smanjujte postepeno dok svetlo i dalje izgleda prihvatljivo.
  4. 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:

  1. Directional Light (sunce/mesec) --- uvek sa senkama.
  2. Kljucno svetlo scene --- jedno svetlo koje definise atmosferu (npr. reflektorska svetiljka u centru, kamin).
  3. 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):

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:

  1. Manje piksela koje GPU mora da obradi za to svetlo.
  2. Manje preklapanja sa drugim svetlima.

Tehnika za pronalazenje optimalnog radijusa:

  1. Postavite svetlo na zeljenu poziciju sa zeljenim intenzitetom.
  2. Smanjujte Attenuation Radius dok ne primetite da se ivica svetla "sece" na vidljivom mestu.
  3. 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

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:

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

  1. Koristite teksture umesto proceduralnih nodova --- uzorkovanje teksture je obicno jeftnije od proceduralnog generisanja.
  2. 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.
  3. 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.
  4. 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:

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:


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:

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

  1. Merite --- snimite baseline performanse pre bilo kakvih promena.
  2. Identifikujte --- koristite profajlere da nadjete najskuplje svetlo/senku.
  3. Promenite --- primenite jednu optimizaciju.
  4. Merite ponovo --- proverite da li je promena donela poboljsanje.
  5. 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

Senke

Lumen

Light Channels i Funkcije


48.13 Primeri iz Prakse --- Studije Slucaja

Studija Slucaja 1: Unutrasnji Prostor --- Restoran

Pocetno stanje:

Optimizacije primenjene:

  1. Smanjeni Attenuation Radius-i:

    • Stolne lampe: 1000 --> 300 unita.
    • Plafonska svetla: 1000 --> 600 unita.
    • Dekorativna svetla: 1000 --> 250 unita.
  2. 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.
  3. 20 plafonskih svetala pretvoreno u Stationary.

  4. 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:

Optimizacije primenjene:

  1. 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.
  2. Ulicna svetla pretvorena u Spot Light (usmerena dole) umesto Point Light.

  3. Smanjeni Attenuation Radius-i na 600 unita (ulicna svetla realisticno ne dopiru daleko).

  4. Lumen optimizacija:

    • Detail Trace Distance: 5000 --> 2500.
    • Final Gather TracesPerProbe: 32 --> 20.
    • Screen Space Scale: 1.0 --> 1.25.
  5. 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:

Pristup:

  1. Forward Rendering aktiviran.
  2. Lumen iskljucen --- koriscene Lightmaps za GI.
  3. Jedno Directional Light (Stationary) sa 2 CSM kaskade (max 15m).
  4. Baked Skylight za ambijentalno osvetljenje.
  5. Eksponati osvetljeni Spot Light-ovima (Stationary, baked senke).
  6. Ukupno samo 2 Movable svetla u celoj sceni (interaktivna baterijska lampa igraca i jedno akcentno svetlo).
  7. 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:

  1. Light Complexity --- razumevanje koliko svetala utice na svaki piksel i zasto je preklapanje problem.
  2. Preklapajuca svetla --- svako dodatno svetlo dodaje kompletnu shader evaluaciju.
  3. Shadow budzetiranje --- senke su najskuplji aspekt, posebno Point Light senke (6 Shadow Map-ova).
  4. Lumen optimizacija --- Detail Trace Distance, Final Gather Quality, Scene Detail i Lighting Quality.
  5. Baked vs Dinamicko --- kada koristiti koji pristup.
  6. VSM cache --- Static objekti = besplatne senke iz cache-a.
  7. Contact Shadows --- koristiti ustedljivo.
  8. Prakticne strategije --- minimiziranje preklapanja, Distance Culling, Light LOD.
  9. Light Channels --- selektivno osvetljenje bez cene.
  10. Light Functions --- drzati jednostavne.
  11. 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

Zvanicna Dokumentacija (Epic Games)

Epic Games Blog i Tech Talks

Akademski i Industrijski Resursi


U sledecem poglavlju cemo se pozabaviti optimizacijom post-processing efekata i kako oni uticu na ukupne performanse vaseg projekta. Vidimo se tamo!