Poglavlje 44: Occlusion i Culling

Poglavlje 44: Occlusion i Culling


Uvod -- Zasto uopste ne renderovati nesto?

Zamislite da stojite u velikoj sobi i gledate kroz prozor ka gradu. Vidite nekoliko zgrada, deo ulice, mozda park u daljini. Ali iza vas su police sa knjigama, sto, stolice -- stvari koje ne vidite jer vam nisu u vidnom polju. Iza zgrada koje vidite kriju se jos desetine objekata koje takodje ne vidite jer ih nesto zaklanja. A daleko na horizontu postoje objekti koji su toliko mali na ekranu da ih je besmisleno renderovati u punoj rezoluciji.

GPU ne zna sta vi vidite. Ako mu kazete "renderiraj sve", on ce poslusno renderovati svaki poligon u sceni -- ukljucujuci one iza vas, one zaklanjene zidom i one na 5 kilometara udaljenosti koji zauzimaju jedan piksel na ekranu. Rezultat? Katastrofalni frame rate.

Culling (od engleskog to cull -- odbaciti, ukloniti) je skup tehnika kojima engine odredjuje koje objekte, mesh-eve ili cak individualne trouglove ne treba slati na renderovanje. Svaki objekat koji uspesno "cullujemo" je ustedjen posao za CPU (koji ne mora da priprema draw call) i GPU (koji ne mora da rasterizuje trouglove).

U ovom poglavlju prolazimo kroz sve glavne culling tehnike koje Unreal Engine 5 koristi, od najjednostavnijih do najnaprednijih:

  1. Frustum Culling -- ne renderuj ono sto je van vidnog polja kamere
  2. Distance Culling -- ne renderuj ono sto je predaleko
  3. Precomputed Visibility Volumes -- unapred izracunata vidljivost za staticne scene
  4. Software Occlusion Culling -- CPU-bazirano testiranje da li je objekat zaklonjen
  5. Hardware Occlusion Queries -- GPU upiti o vidljivosti objekata
  6. Nanite Occlusion Culling -- per-cluster GPU-driven culling za Nanite mesh-eve

Na kraju poglavlja, pogledacemo kako da debugujemo culling, prakticne strategije za razlicite tipove scena i zavrsicemo tabelom kljucnih pojmova.

Napomena o terminologiji: Kao i u ostatku knjige, tehnicke termine (frustum, occlusion, culling, bounding box, draw call, itd.) ostavljamo na engleskom jer su to standardni termini u game development industriji. Prevodjenje bi samo stvorilo konfuziju.


44.1 Zasto je Culling kriticno vazan za performanse

Pre nego sto zaronimo u konkretne tehnike, hajde da razumemo zasto je culling toliko bitan -- i za CPU i za GPU.

44.1.1 CPU strana price

Svaki objekat koji se renderuje prolazi kroz pipeline na CPU strani:

  1. Visibility determination -- da li je objekat vidljiv?
  2. Relevance checks -- da li je objekat dovoljno blizu/vazan da se renderuje?
  3. Draw call preparation -- priprema podataka za GPU (materijali, transformacije, shader parametri)
  4. Command buffer submission -- slanje komandi GPU-u

Koraci 3 i 4 su skupi. Svaki draw call ima overhead na CPU strani. Ako imate scenu sa 50.000 objekata, a samo 2.000 je vidljivo, culling vam stedi pripremu 48.000 draw call-ova. To moze da bude razlika izmedju 60 FPS i 15 FPS.

44.1.2 GPU strana price

Na GPU strani, svaki trougao koji se renderuje prolazi kroz:

  1. Vertex Shader -- transformacija svake tacke trougla
  2. Rasterization -- pretvaranje trougla u fragmente (piksele)
  3. Fragment/Pixel Shader -- izracunavanje boje svakog piksela
  4. Depth test, blending, write -- zavrsna obrada

Ako renderujete 10 miliona trouglova koji su iza zida i nece se nikada videti na ekranu, GPU radi ogroman posao uzalud. Culling eliminise taj nepotrebni posao.

44.1.3 Overdraw problem

Cak i kada objekat jeste u vidnom polju, ako je kompletno zaklonjen drugim objektom (recimo, ormar iza zida), renderovanje tog ormara je cist gubitak. GPU ce izracunati boju svakog piksela ormara, samo da bi depth test rekao "nema potrebe, vec postoji blizi piksel". Ovo se zove overdraw i jedan je od glavnih neprijatelja performansi u kompleksnim scenama.

44.1.4 Масштаб проблема у великим scenama

U malim scenama (recimo, jedna soba sa 50 objekata), culling nije kritican -- GPU moze da se nosi i bez njega. Ali u modernim igrama situacija je drasticno drugacija:

Tip scene Tipican broj objekata Bez cullinga Sa cullingom
Mala soba 50-200 Radi OK Minimalan uticaj
Grad (jedan blok) 5.000-20.000 Problematicno Neophodno
Open world (1 km2) 100.000-500.000 Neigrajivo Kriticno
AAA open world 1.000.000+ Nemoguce Apsolutno neophodno

Kao sto vidite, sto je scena veca, culling postaje vazniji. U open world igrama, culling je bukvalno razlika izmedju igre koja radi i igre koja se ne moze pokrenuti.


44.2 Frustum Culling -- Osnova svega

44.2.1 Sta je View Frustum?

Ako ste citali Poglavlje 06 (gde smo detaljno objasnili frustum), znate da je view frustum (vidna piramida) oblik koji opisuje sta kamera "vidi". To je zarubljena piramida (truncated pyramid) definisana sa sest ravni:

Sve sto je unutar ovog volumena je potencijalno vidljivo. Sve sto je van njega definitivno nije vidljivo i moze se bezbedno preskociti.

44.2.2 Kako frustum culling radi

Algoritam je konceptualno jednostavan:

Za svaki objekat u sceni:
    1. Uzmi bounding volume objekta (obicno AABB ili sphere)
    2. Testiraj da li bounding volume preseca view frustum
    3. Ako NE preseca --> CULL (ne renderuj)
    4. Ako preseca --> DRAW (renderuj)

Test "da li bounding volume preseca frustum" se svodi na testiranje objekta protiv sest ravni frustuma. Objekat je van frustuma ako je kompletno sa spoljasnje strane bilo koje od sest ravni.

Za Axis-Aligned Bounding Box (AABB) -- koji smo detaljno objasnili u Poglavlju 03 -- test se radi tako sto se za svaku ravan frustuma proveri da li su svih 8 tacaka AABB-a sa spoljasnje strane. Ako jesu, objekat je van frustuma.

Za Bounding Sphere je jos jednostavnije -- proverava se da li je centar sfere udaljen od ravni vise od radijusa sfere.

44.2.3 Frustum Culling u UE5 -- automatski i besplatan

Odlicna vest: frustum culling je automatski ukljucen u UE5 i ne morate nista posebno da radite da biste ga aktivirali. Engine ga izvrsava za svaki frame, za svaki objekat u sceni.

UE5 koristi hijerarhijsku strukturu za ubrzanje frustum testova. Umesto da testira svaki objekat individualno (sto bi bilo O(n) za n objekata), engine koristi prostorne strukture podataka koje omogucavaju brzo odbacivanje velikih grupa objekata odjednom.

44.2.4 Znacaj velicine Bounding Box-a

Ovo je cesto zanemarena ali izuzetno vazna tema. Velicina bounding box-a direktno utice na efikasnost frustum cullinga.

Problem prevelikog bounding box-a:

Zamislite da imate mesh koji je dugacka, tanka cijev -- recimo, 50 metara duga a 10 cm siroka. Njen AABB ce biti kutija od 50 x 0.1 x 0.1 metara. Ako je ta cijev dijagonalno postavljena u sceni, AABB ce zapravo biti mnogo veci -- recimo 35 x 35 x 0.1 metara -- jer AABB mora da bude poravnat sa osama koordinatnog sistema.

Sta to znaci u praksi? Taj objekat ce reze biti culled jer njegov bounding box ulazi u frustum cak i kada sam mesh nije vidljiv.

Prakticni saveti:

// U UE5, svaki Actor ima Bounds Scale property
// Default je 1.0. Mozete ga podesiti u Details panelu.
// Veci broj = veci bounding box = manje agresivan culling
// Manji broj = manji bounding box = agresivniji culling (ali rizik od poppinga)

44.2.5 Frustum Culling i visestruke kamere

Frustum culling se izvrsava za svaku kameru posebno. Ovo je relevantno u nekoliko situacija:

Zbog toga, smanjenje broja kamera koje aktivno renderuju scenu moze znacajno da poboljsa performanse -- ne samo zbog samog renderovanja, vec i zbog visestrukih culling pass-ova.


44.3 Distance Culling -- Ne renderuj predaleke objekte

44.3.1 Koncept

Distance culling je jednostavna ali mocna tehnika: ako je objekat dalje od odredjene udaljenosti od kamere, ne renderuj ga. Logika je da objekti koji su veoma daleko zauzimaju mali broj piksela na ekranu i njihovo renderovanje donosi minimalan vizuelni doprinos, a kosta draw call.

44.3.2 Per-Actor Cull Distance u UE5

Svaki Actor u UE5 ima property koji se zove Min Draw Distance i implicitno koristi Max Draw Distance (koji se moze podesiti kroz Cull Distance Volume, o cemu cemo pricati u narednoj sekciji).

Da biste podesili per-actor cull distance:

  1. Selektujte Actor u sceni
  2. U Details panelu, pronadjite sekciju Rendering
  3. Podesiti Desired Max Draw Distance -- ovo je rastojanje (u UE jedinicama, tj. centimetrima) nakon kojeg ce Actor biti culled
// Primer: Actor koji nestaje na 5000 UE jedinica (50 metara)
MyActor->SetCullDistance(5000.0f);

// Ili u Details panelu:
// Desired Max Draw Distance: 5000

Vazna napomena: Desired Max Draw Distance je "zelja" Actora. Ako postoji Cull Distance Volume koji pokriva taj deo scene i ima strozi (manji) max draw distance za tu kategoriju velicine, Volume ce "pobediti" i Actor ce biti culled ranije.

44.3.3 Cull Distance Volumes

Cull Distance Volume je poseban Volume actor u UE5 koji vam omogucava da definisete pravila za distance culling na nivou citave oblasti scene.

Kako funkcionise

Cull Distance Volume sadrzi tabelu koja mapira velicinu objekta na maksimalnu udaljenost renderovanja:

Velicina objekta (Bounding Sphere Radius) Max Draw Distance
0 - 100 5.000
100 - 500 15.000
500 - 1.000 30.000
1.000 - 5.000 50.000
5.000+ 0 (nikada ne culluj)

Logika je intuitivna: manji objekti se culluju na manjoj udaljenosti jer zauzimaju manje piksela na ekranu i manje se primecuju kada nestanu. Veliki objekti (zgrade, planine) se culluju na vecoj udaljenosti ili uopste ne.

Kreiranje Cull Distance Volume-a

  1. U Place Actors panelu, pronadjite Cull Distance Volume
  2. Postavite ga u scenu i skalirajte da pokrije zeljenu oblast
  3. Selektujte Volume i u Details panelu pronadjite Cull Distances niz
  4. Dodajte parove (Size, Cull Distance):
    • Size = radijus bounding sphere objekta
    • Cull Distance = maksimalna udaljenost renderovanja
// Primer konfiguracije Cull Distance Volume-a:
// (ovo se obicno radi u editoru, ali moze i programski)

// Size: 50,   CullDistance: 3000    // Mali objekti (flase, knjige)
// Size: 200,  CullDistance: 10000   // Srednji objekti (stolice, stolovi)
// Size: 500,  CullDistance: 25000   // Veci objekti (automobili)
// Size: 1000, CullDistance: 50000   // Veliki objekti (kuce)
// Size: 5000, CullDistance: 0       // Ogromni objekti (nikad ne culluj)

Visestruki Cull Distance Volumes

Mozete imati vise Cull Distance Volume-a u sceni koji se preklapaju. Kada se Actor nalazi unutar vise Volume-a, koristi se najmanji (najstrozi) cull distance. Ovo vam omogucava da imate razlicita pravila za razlicite delove scene:

44.3.4 Distance Culling i World Partition

Ako koristite World Partition sistem (detaljno obradjen u Poglavlju 32), distance culling i streaming rade zajedno:

Ovo su dva razlicita sistema koji se dopunjuju. Objekat moze biti ucitan u memoriju (jer je u streaming distance-u) ali se ne renderuje (jer je van cull distance-a). Ovo je korisno jer ucitavanje u memoriju nije instant -- potrebno je vreme za streaming -- pa zelite da objekti budu spremni pre nego sto postanu vidljivi.

44.3.5 HLOD i Distance Culling

Hierarchical Level of Detail (HLOD) je sistem gde se grupa objekata na velikoj udaljenosti zamenjuje jednim pojednostavljenim mesh-om. Ovo je komplementarno sa distance cullingom:


44.4 Precomputed Visibility Volumes

44.4.1 Ideja iza Precomputed Visibility

Frustum culling i distance culling su "jeftine" provere, ali ne resavaju problem occlusion-a -- objekat moze biti unutar frustuma i dovoljno blizu, ali kompletno zaklonjen zidom. Da bismo utvrdili da li je objekat zaklonjen, potrebna je skuplja analiza.

Precomputed Visibility je tehnika gde se offline (pre pokretanja igre, tokom build procesa) izracunava koja oblast scene vidi koje objekte. Rezultati se cuvaju u baked podatke i koriste tokom runtime-a za brzu pretragu.

44.4.2 Kako funkcionise

  1. Podela prostora na celije: Scena se deli na 3D grid celija (obicno 200x200x200 UE jedinica)
  2. Visibility sampling: Za svaku celiju, engine izracunava koje objekte ta celija moze da vidi (slanjem zraka ili koristeci PVS -- Potentially Visible Set algoritme)
  3. Cuvanje rezultata: Rezultat je bitmaska za svaku celiju -- za svaki objekat, jedan bit koji kaze "vidljiv" ili "nevidljiv"
  4. Runtime lookup: Tokom igre, engine proverava u kojoj celiji se kamera nalazi i koristi precomputed bitmasku da brzo iskljuci nevidljive objekte

44.4.3 Postavljanje u UE5

  1. Postavite Precomputed Visibility Volume u scenu (Place Actors > Volumes > Precomputed Visibility Volume)
  2. Skalirajte Volume da pokrije oblast gde zelite precomputed visibility
  3. U World Settings, podesiti:
    • Precompute Visibility: True
    • Visibility Cell Size: Velicina celije (default 200). Manji = precizniji ali vise memorije
    • Visibility Aggressiveness: Koliko agresivno se odbacuju objekti
  4. Build Lighting (ili Precompute Visibility odvojeno) -- ovo je offline proces koji moze trajati od minuta do sati, zavisno od velicine scene
// World Settings podesavanja:
// Precompute Visibility: True
// Visibility Cell Size: 200 (default)
// Visibility Aggressiveness: 
//   - Least Aggressive (0) -- konzervativno, manje false negatives
//   - Most Aggressive (3) -- agresivno, brze ali rizik od poppinga

44.4.4 Kada koristiti Precomputed Visibility

Idealno za:

Nije idealno za:

44.4.5 Ogranicenja


44.5 Software Occlusion Culling

44.5.1 Koncept

Software Occlusion Culling je tehnika gde CPU renderuje pojednostavljenu verziju scene (obicno samo dubinu/depth) u mali buffer i zatim testira objekte protiv tog depth buffer-a da utvrdi da li su zaklanjeni.

Zamislite to ovako: CPU nacrta "skicu" scene u maloj rezoluciji (recimo 256x256 piksela), i onda za svaki objekat pita "da li bi ovaj objekat bio vidljiv ili je nesto ispred njega?"

44.5.2 Kako radi u UE5

UE5 ima ugradjeni Software Occlusion system:

  1. Occluder meshevi se renderuju u mali depth buffer na CPU-u
  2. Za svaki objekat koji treba da se testira, njegov bounding box se projektuje na taj depth buffer
  3. Ako je bounding box kompletno "iza" vec renderovanih piksela u depth bufferu, objekat je zaklonjen i moze se preskociti
// Aktiviranje Software Occlusion Culling-a:
// U Project Settings > Engine > Rendering:
// Software Occlusion Culling: True

// Ili u konzoli:
r.SO.Enable 1

// Podesavanje rezolucije depth buffer-a:
r.SO.BufferSize 256    // default

44.5.3 Prednosti

44.5.4 Mane

44.5.5 Kada koristiti

Software Occlusion je koristan za:


44.6 Hardware Occlusion Queries

44.6.1 Koncept

Hardware Occlusion Queries koriste GPU da testira da li je objekat vidljiv. Ideja je:

  1. Renderuj bounding box objekta kao "query" -- ne crta se na ekran, vec se samo pita GPU "da li bi bilo koji piksel ovog bounding box-a prosao depth test?"
  2. GPU izvrsi test i vrati rezultat: broj piksela koji bi prosli depth test
  3. Ako je taj broj 0 (ili ispod nekog praga), objekat je zaklonjen

44.6.2 Kako funkcionise u praksi

// Pseudo-kod hardware occlusion query:

// Frame N:
1. GPU renderuje scenu normalno
2. Za objekte koji su kandidati za occlusion testing:
   a. Posalji GPU-u query: "Renderuj bounding box objekta X, koliko piksela prolazi?"
   b. GPU izvrsi test (ali ne crta na ekran)

// Frame N+1 (ili N+2):
3. CPU cita rezultate query-ja iz prethodnog frame-a
4. Ako je broj vidljivih piksela == 0:
   --> Objekat je zaklonjen, ne renderuj ga u ovom frame-u
5. Ako je broj vidljivih piksela > 0:
   --> Objekat je vidljiv, renderuj ga

44.6.3 Problem latencije -- Kljucni izazov

Primijetili ste problem u pseudo-kodu iznad? GPU query iz frame-a N se ne moze procitati u frame-u N. Rezultat je dostupan tek u frame-u N+1 ili cak N+2. Ovo je zato sto:

Ova latencija od 1-2 frame-a stvara problem: koristimo zastarele podatke da odlucimo sta da renderujemo. Ako se kamera brzo pomeri, objekat koji je bio zaklonjen u frame-u N moze da postane vidljiv u frame-u N+2, ali mi smo ga vec odlucili preskociti. Rezultat: objekat "blinkne" na ekranu -- pojavi se frame kasnje nego sto bi trebalo.

44.6.4 Strategije za ublazavanje latencije

UE5 koristi nekoliko strategija da ublazi ovaj problem:

1. Konzervativno testiranje: Umesto tacnog bounding box-a, koristi se malo veci bounding box za occlusion query. Ovo znaci da ce objekat "postati vidljiv" malo ranije nego sto zaista treba, cime se smanjuje rizik od poppinga.

2. "Render if uncertain" pristup: Ako nema rezultata query-ja (npr. prvi frame), objekat se renderuje. Bolje je renderovati nepotreban objekat nego propustiti vidljiv objekat.

3. Multi-frame amortizacija: Ne testiraju se svi objekti u svakom frame-u. Objekat se testira jednom i rezultat se koristi nekoliko frame-ova, a zatim se ponovo testira. Ovo smanjuje broj query-ja ali povecava latenciju za neke objekte.

4. Temporal coherence: Pretpostavka je da se vidljivost objekta ne menja drasticno iz frame-a u frame. Ako je objekat bio vidljiv u prethodnom frame-u, verovatno je i dalje vidljiv. Ova heuristika uglavnom radi dobro, osim kod brzih pokreta kamere.

44.6.5 Hardware Occlusion Queries u UE5

// Kontrola Hardware Occlusion Queries u UE5:

// Ukljucivanje/iskljucivanje:
r.HZBOcclusion 1        // Hierarchical Z-Buffer occlusion (default ON)
r.AllowOcclusionQueries 1 // Hardware occlusion queries

// Podesavanje agresivnosti:
r.HZBOcclusion.MaxPixelThreshold 4  // Min piksela da se smatra vidljivim

Hierarchical Z-Buffer (HZB) Occlusion je napredna varijanta hardware occlusion-a koju UE5 koristi. Umesto individualnih query-ja za svaki objekat, HZB kreira hijerarhiju depth buffer-a (mipmap lanac depth texture-a) i testira objekte protiv njega. Ovo je efikasnije jer:

44.6.6 Prednosti i mane

Prednosti:

Mane:


44.7 Nanite Occlusion Culling -- Revolucija u culling-u

44.7.1 Sta Nanite menja

Nanite, Unreal Engine 5 virtualized geometry system (detaljno obradjen u Poglavlju 30), donosi fundamentalno drugaciji pristup occlusion culling-u. Umesto da radi na nivou celih mesh-eva, Nanite radi occlusion culling na nivou klastera (grupa trouglova).

44.7.2 Per-Cluster GPU-Driven Culling

Nanite mesh je interno podeljen na klastere -- male grupe od otprilike 128 trouglova. Svaki klaster ima svoj bounding box. Nanite culling pipeline radi ovako:

Za svaki Nanite mesh u sceni:
    Za svaki klaster u mesh-u (moze ih biti hiljade):
        1. Instance Culling -- da li je instanca uopste relevantna?
        2. Frustum Culling -- da li je klaster u frustumu?
        3. HZB Occlusion Culling -- da li je klaster zaklonjen?
        4. Screen-size Culling -- da li je klaster dovoljno veliki na ekranu?
        5. Ako prodje sve testove --> renderuj klaster
        6. Ako padne na bilo kom testu --> preskoci klaster

Kljucna razlika: Ceo ovaj pipeline se izvrsava na GPU-u, ne na CPU-u. Ovo eliminise:

44.7.3 Two-Pass Occlusion Culling

Nanite koristi dvoradni (two-pass) pristup occlusion culling-u koji elegantno resava problem latencije:

Pass 1 -- Prethodni frame test:

  1. Koristi HZB (Hierarchical Z-Buffer) iz prethodnog frame-a
  2. Testira sve klastere protiv tog HZB-a
  3. Klasteri koji su bili vidljivi u prethodnom frame-u se renderuju
  4. Klasteri koji su mozda zaklanjeni se stavljaju u "uncertain" listu

Pass 2 -- Trenutni frame test:

  1. Iz renderovanih klastera iz Pass 1, generise se novi HZB za trenutni frame
  2. "Uncertain" klasteri se testiraju protiv ovog novog HZB-a
  3. Klasteri koji prolaze test se dodatno renderuju
  4. Klasteri koji ne prolaze su zaista zaklanjeni

Ovaj two-pass pristup obezbedjuje:

44.7.4 Screen-Size Culling u Nanite

Osim occlusion-a, Nanite takodje radi screen-size culling -- ako bi klaster zauzimao manje od odredjenog broja piksela na ekranu, preskace se. Ovo je automatski LOD sistem na nivou klastera:

Ovo je ekvivalentno distance culling-u, ali mnogo finijeg granulariteta -- umesto da ceo mesh nestane, postepeno se smanjuje detalj.

44.7.5 Nanite vs. tradicionalni culling

Aspekt Tradicionalni Culling Nanite Culling
Granularnost Per-mesh (ceo objekat) Per-cluster (~128 trouglova)
Izvrsavanje CPU GPU
Latencija 1-2 frame-a (HW queries) 0 frame-ova (two-pass u istom frame-u)
LOD Diskretni LOD nivoi Kontinualan, per-cluster
Setup Rucno (cull distances, volumes) Automatski
Ogranicenja Mesh mora biti Static Mora biti Nanite-enabled mesh

44.7.6 Sta Nanite ne pokriva

Vazno je razumeti da Nanite culling radi samo za Nanite-enabled mesh-eve. Ostali objekti (skeletal meshevi, particle sistemi, non-Nanite static meshevi) i dalje koriste tradicionalne culling metode. Zato je poznavanje svih culling tehnika i dalje vazno.


44.8 Prakticne strategije za razlicite tipove scena

44.8.1 Velika Open World scena

Open world scene su najzahtevniji slucaj za culling. Imate potencijalno milione objekata rasprostranjene na ogromnoj povrsini, sa razlicitim zonama (gradovi, sume, polja, planine).

Strategija:

  1. World Partition za streaming (videti Poglavlje 32):

    • Podelite svet na celije odgovarajuce velicine
    • Podesite streaming distance da ucitavate samo relevantne celije
    • Koristite Data Layers za razlicite kategorije objekata
  2. Cull Distance Volumes za razlicite zone:

    • Gradski delovi: agresivniji culling (vise objekata, manje vidljivosti na daljinu)
    • Otvoreni tereni: manje agresivan culling (manje objekata, vise vidljivosti)
    • Sume: srednje agresivan (drvece zaklanja, ali je manje gusto nego grad)
  3. HLOD za daleke objekte:

    • Generisati HLOD za grupe objekata (npr. ceo blok zgrada postaje jedan simplified mesh)
    • HLOD se prikazuje na velikoj udaljenosti, a individualni objekti na maloj
  4. Nanite za detaljnu geometriju:

    • Sve staticke mesh-eve koji to podrzavaju konvertovati u Nanite
    • Pustiti Nanite da automatski upravlja LOD-om i per-cluster cullingom
  5. Per-Actor cull distance za specificne kategorije:

    • Sitni objekti (kamenice, trava, smece): mali cull distance (2.000-5.000)
    • Srednji objekti (klupe, znakovi, drvo): srednji cull distance (10.000-20.000)
    • Veliki objekti (zgrade, stene): veliki cull distance (50.000+) ili bez distance cullinga

Primer podesavanja za open world:

// Console komande za fine-tuning:

// Podesavanje minimalnog screen size-a za renderovanje
r.SkeletalMesh.ScreenSizeScale 1.0
r.StaticMesh.ScreenSizeScale 1.0

// Nanite culling podesavanja
r.Nanite.MaxPixelsPerEdge 1.0   // Kontrolise LOD agresivnost

// Foliage culling
foliage.CullDistanceScale 1.0   // Globalni skaler za foliage cull distance
foliage.MinimumScreenSize 0.001 // Minimalni screen size za foliage

44.8.2 Gusta interior scena (zgrade, dungeon-i)

Interior scene su obicno najpogodnije za occlusion culling jer zidovi efikasno zaklanjaju objekte. Kljucne strategije:

Strategija:

  1. Precomputed Visibility je idealan:

    • Postavite Precomputed Visibility Volume preko cele zgrade
    • Koristite manji Cell Size (100-150) za preciznije rezultate
    • Rebuild posle svake promene geometrije
  2. Pravilna podela geometrije:

    • Svaka soba treba da bude poseban mesh (ili grupa mesh-eva)
    • Zidovi izmedju soba treba da budu dobri occluder-i
    • Izbegavajte jedan veliki mesh za ceo sprat
  3. Portali i logicko razdvajanje:

    • Vrata su prirodni "portali" -- objekti u susednoj sobi su vidljivi samo ako su vrata otvorena i kamera gleda ka njima
    • UE5 nema explicit portal system kao neki drugi engine-i, ali Precomputed Visibility i HZB occlusion postizu slican efekat
  4. Pazi na providne objekte:

    • Staklo, reshetke i drugi providni/poluprozirni objekti komplikuju occlusion jer ne zaklanjaju u potpunosti
    • Razmislite da li providni objekti treba da budu occluder-i ili ne

Primer organizacije interior scene:

// Struktura interior scene:
// Building_01/
//   Floor_01/
//     Room_01_Walls (Static Mesh, occluder)
//     Room_01_Floor (Static Mesh)
//     Room_01_Furniture/ (grupa manjih objekata)
//       Chair_01
//       Table_01
//       Lamp_01
//     Room_01_Door (moze biti dinamicna)
//   Floor_02/
//     Room_02_Walls
//     ...

// Svaka soba ima sopstveni bounding box
// Zidovi efektivno zaklanjaju objekte u susednim sobama
// Precomputed Visibility koristi ovu strukturu za efikasan culling

44.8.3 Hibridne scene (spoljasnjost + unutrasnjost)

Mnoge moderne igre imaju scene gde igrac moze slobodno da prelazi izmedju spoljasnjosti (open world) i unutrasnjosti (zgrade). Ovo je najslozeniji slucaj.

Strategija:

  1. Kombinujte tehnike:

    • Koristite Precomputed Visibility za interijere
    • Koristite Cull Distance Volumes za eksterijere
    • Koristite Nanite za detaljnu staticku geometriju svuda
  2. World Partition + Interior streaming:

    • Interijer zgrade ne mora da bude ucitan dok igrac nije u blizini
    • Koristite Level Instances ili Data Layers za kontrolu ucitavanja interijera
  3. Posebna paznja na prelaze:

    • Kada igrac gleda spolja kroz prozor, vidi se deo interijera -- ovo mora da radi bez poppinga
    • Kada igrac izadje iz zgrade, ceo grad treba da bude vec spreman
    • Streaming distance za interijer treba da bude dovoljno veliki da pokrije ove prelaze

44.8.4 Scene sa mnogo instanci (sume, gradovi)

Kada imate hiljade instanci istog mesh-a (drvece, zgrade u gridu), Instanced Static Mesh ili Hierarchical Instanced Static Mesh (HISM) komponente pomazu culling-u:

// Foliage sistem u UE5 automatski koristi HISM
// Za custom instanciranje, koristite HISM komponentu:

UHierarchicalInstancedStaticMeshComponent* HISMComp = 
    NewObject<UHierarchicalInstancedStaticMeshComponent>(this);
HISMComp->SetStaticMesh(MyMesh);

// Dodavanje instanci:
for (int32 i = 0; i < NumInstances; i++)
{
    FTransform Transform;
    Transform.SetLocation(FVector(i * 100.0f, 0.0f, 0.0f));
    HISMComp->AddInstance(Transform);
}

// HISM ce automatski organizovati instance za efikasan culling

44.9 Debugging Culling-a

Znati da culling postoji je jedno -- znati da li radi pravilno u vasoj sceni je sasvim drugo. UE5 nudi nekoliko alata za debugovanje culling-a.

44.9.1 FreezeRendering komanda

Ovo je najkorisniji alat za debugovanje culling-a. Komanda FreezeRendering zamrzava renderovanje u trenutnom stanju -- scena nastavlja da se renderuje kao da je kamera na poziciji gde ste je zamrzli, ali mozete slobodno da se kresite po sceni i vidite koji objekti su renderovani a koji nisu.

Kako koristiti:

  1. Pozicionirajte kameru gde zelite da analizirate culling
  2. Otvorite konzolu (tilda ~) i ukucajte:
    FreezeRendering
    
  3. Sada mozete da se kresite po sceni. Objekti koji su culled ce nedostajati -- videcete "rupe" u sceni gde bi objekti trebali da budu
  4. Da odmrznete renderovanje:
    FreezeRendering
    
    (ista komanda toggleuje)

Sta traziti:

44.9.2 Wireframe pogled

Wireframe pogled vam omogucava da vidite sve renderovane objekte kao zicane modele, bez popunjenih povrsina. Ovo je korisno jer mozete lakse uociti preklapanja i nepotrebno renderovane objekte.

Aktiviranje:

  1. U Viewport-u, kliknite na "Lit" dropdown i izaberite Wireframe
  2. Ili pritisnite Alt+2 (shortcut za wireframe mode)
  3. Ili u konzoli:
    viewmode wireframe
    

Kombinacija sa FreezeRendering:

  1. Ukljucite wireframe mode
  2. Pozicionirajte kameru
  3. Ukucajte FreezeRendering
  4. Predjite na normalan pogled (Alt+4 za Lit mode)
  5. Sada mozete da se kresite i vidite koji objekti se renderuju (oni koji su vidljivi) a koji ne (oni koji nedostaju jer su culled)

44.9.3 Stat komande za culling

UE5 ima nekoliko stat komandi koje prikazuju statistike relevantne za culling:

// Opste renderovanje statistike:
stat scenerendering
// Prikazuje: Mesh draw calls, primitives drawn, itd.
// Kljucni brojevi:
//   - "Mesh Draw Calls" -- koliko draw call-ova imate
//   - "Visible Static Mesh Elements" -- vidljivi elementi
//   - "Culled primitives" -- koliko je primitiva culled

// Inicijalizacija scene:
stat initviews
// Prikazuje: Frustum culling vreme, occlusion culling vreme
// Kljucni brojevi:
//   - "Frustum Cull" -- vreme utroseno na frustum culling
//   - "Occlusion Cull" -- vreme za occlusion queries
//   - "View Relevance" -- vreme za odredjivanje relevantnosti

// Nanite statistike:
stat Nanite
// Prikazuje: Nanite-specificne metrike
// Kljucni brojevi:
//   - "Visible Clusters" -- koliko klastera se renderuje
//   - "Total Clusters" -- ukupan broj klastera u sceni
//   - "Culled Clusters" -- koliko je klastera culled

44.9.4 Vizualizacija Bounding Box-ova

Da biste videli bounding box-ove objekata u sceni:

// Prikaz bounding box-ova:
show bounds

// Ili specificno za static mesh-eve:
r.StaticMesh.ShowBounds 1

Ovo je korisno da vidite da li bounding box-ovi odgovaraju stvarnoj velicini mesh-eva. Preveliki bounding box-ovi su cest uzrok neefikasnog cullinga.

44.9.5 Vizualizacija Occlusion-a

// Vizualizacija HZB occlusion-a:
r.HZBOcclusion.Visualize 1

// Vizualizacija precomputed visibility celija:
show precomputedvisibility
// (prikazuje grid celija i njihov status)

44.9.6 GPU Visualizer (ProfileGPU)

Za detaljniju analizu GPU performansi, ukljucujuci vreme utroseno na occlusion queries:

// Otvorite GPU profiler:
ProfileGPU

// Ili koristite shortcut: Ctrl+Shift+, (comma)

U GPU profileru mozete videti koliko vremena GPU trosi na:

44.9.7 Nanite Visualization Modes

Za debugovanje Nanite culling-a, UE5 nudi posebne vizualizacione modove:

  1. U Viewport-u, kliknite na Lit dropdown
  2. Izaberite Nanite Visualization
  3. Birajte izmedju:
    • Triangles -- prikazuje gustinu trouglova (pomaze da vidite LOD ponasanje)
    • Clusters -- prikazuje individualne klastere razlicitim bojama
    • Overdraw -- prikazuje gde se klasteri preklapaju
    • Hierarchy -- prikazuje hijerarhiju klastera
    • Level of Detail -- prikazuje koji LOD nivo se koristi

Ovi vizualizacioni modovi su neprocenjivi za razumevanje kako Nanite upravlja cullingom i LOD-om u vasoj sceni.

44.9.8 Prakticni debugging workflow

Evo predlozenog workflow-a za debugovanje culling problema:

Korak 1: Identifikujte problem

stat scenerendering
stat initviews

Pogledajte koliko primitiva se renderuje i koliko vremena CPU trosi na culling.

Korak 2: Vizualizujte sta se renderuje

FreezeRendering

Zamrznite renderovanje i obidjite scenu da vidite sta je culled a sta nije.

Korak 3: Proverite bounding box-ove

show bounds

Potrazite prevelike bounding box-ove koji sprecavaju efikasan culling.

Korak 4: Analizirajte Nanite (ako je u upotrebi) Koristite Nanite Visualization modove da vidite koliko klastera se renderuje.

Korak 5: Fino podesite Na osnovu nalaza, podesite cull distances, Cull Distance Volumes, bounding box scale, itd.


44.10 Culling Pipeline -- Kako sve radi zajedno

Do sada smo govorili o individualnim culling tehnikama. Hajde da pogledamo kako one rade zajedno u UE5 rendering pipeline-u.

44.10.1 Redosled operacija

Kada UE5 priprema frame za renderovanje, culling se desava u sledecim fazama:

Svi objekti u sceni
        |
        v
[1. Distance Culling]
  Odbaci objekte koji su predaleko
  (na osnovu per-actor cull distance i Cull Distance Volumes)
        |
        v
[2. Frustum Culling]
  Odbaci objekte koji su van view frustuma
  (automatski, na osnovu bounding box-a vs. camera frustum)
        |
        v
[3. Precomputed Visibility]
  Odbaci objekte koji su nevidljivi prema baked podacima
  (samo za staticke objekte u oblastima sa Precomputed Visibility Volume)
        |
        v
[4. Software Occlusion / HZB Occlusion]
  Odbaci objekte koji su zaklanjeni drugim objektima
  (GPU-bazirano za Nanite, CPU ili GPU za ostale)
        |
        v
Preostali objekti se salju na renderovanje
        |
        v
[5. Nanite Per-Cluster Culling (za Nanite mesheve)]
  Dodatni, finiji culling na nivou klastera
  (frustum + occlusion + screen-size, sve na GPU)
        |
        v
Finalni set geometrije za rasterizaciju

44.10.2 Svaka faza smanjuje posao za sledecu

Primetite da svaka faza smanjuje broj objekata za sledecu fazu. Ovo je vazno jer:

Ovo je cascading filter pristup -- svaki filter je skuplji ali precizniji, i prima sve manji broj kandidata.

44.10.3 Primer iz prakse

Zamislite open world scenu sa 200.000 objekata:

Faza Ulaznih objekata Culled Preostalo
Pocetno stanje 200.000 - 200.000
Distance Culling 200.000 140.000 60.000
Frustum Culling 60.000 42.000 18.000
Precomputed Visibility 18.000 6.000 12.000
Occlusion Culling 12.000 4.000 8.000
Renderovano - - 8.000

Od 200.000 objekata, samo 8.000 se zaista renderuje -- to je 96% redukcija! Bez cullinga, GPU bi morao da obradi geometriju svih 200.000 objekata.


44.11 Napredne teme

44.11.1 Occlusion i Shadows

Jedna cesta greska je zaboraviti da senke imaju sopstveni culling. Svaki shadow-casting light ima svoj frustum (ili vise frustuma za cascaded shadow maps), i objekti se moraju testirati i za renderovanje senki, ne samo za glavnu kameru.

Ovo znaci da objekat koji je culled za glavnu kameru mozda nije culled za shadow map -- njegova senka moze da bude vidljiva cak i kada sam objekat nije. UE5 automatski upravlja ovim, ali je vazno razumeti jer:

// Podesavanje shadow cull distance-a:
// Na Actor-u u Details panelu:
// Shadow Max Draw Distance: 10000 (npr.)

// Ili globalno:
r.Shadow.MaxCSMResolution 2048
r.Shadow.CSM.MaxCascades 4

44.11.2 Occlusion i Transparency

Providni (translucent) objekti predstavljaju poseban izazov za occlusion culling:

U praksi, ovo znaci da scene sa mnogo providnih objekata (npr. staklene zgrade) imaju manje koristi od occlusion culling-a.

44.11.3 Culling i Ray Tracing

Hardware ray tracing u UE5 ima sopstvene culling mehanizme koji se razlikuju od rasterizacionog culling-a:

44.11.4 Culling u Multiplayer igrama

U multiplayer igrama (posebno dedicated server), culling ima dodatnu dimenziju:

// Primer: podesavanje network cull distance na Actor-u
// u konstruktoru Actor-a:
NetCullDistanceSquared = 150000000.0f; // ~12247 UE jedinica
bAlwaysRelevant = false; // Ne salji uvek svim igracima

44.12 Ceste greske i kako ih izbeci

44.12.1 Preveliki mesh-evi

Problem: Jedan mesh pokriva celu zgradu ili ceo nivo terena. Bounding box je ogroman i mesh se gotovo nikada ne culluje.

Resenje: Razbijte mesh na manje delove. Svaka soba, svaki sprat, svaki segment terena treba da bude poseban mesh.

44.12.2 Pogresno postavljeni pivot points

Problem: Mesh ima pivot point daleko od vidljive geometrije (cest problem pri izvozu iz 3D programa). Ovo vestacki povecava bounding box.

Resenje: U 3D programu (Blender, Maya, 3ds Max), resetujte pivot point na centar geometrije pre izvoza.

44.12.3 Nevidljiva geometrija koja povecava bounds

Problem: Mesh ima vertex-e koji su daleko od vidljivog dela -- mozda zaboravljeni vertex-i ili pomocna geometrija koja nije obrisana pre izvoza.

Resenje: Proverite mesh u 3D programu. Selektujte sve vertex-e i proverite da nema usamljenih vertex-a daleko od glavne geometrije.

44.12.4 Previse agresivan cull distance

Problem: Objekti "poppuju" -- iznenada se pojavljuju/nestaju dok se igrac krece.

Resenje:

// Ukljucivanje dithered LOD tranzicije na mesh-u:
// Static Mesh Editor > LOD Settings:
// LOD Transition: Dithered
// Ovo daje postepen prelaz umesto naglog "poppa"

44.12.5 Zaboravljeni debug vizualizacije

Problem: Ostavili ste show bounds ili vizualizacione modove ukljucene u shipping build-u.

Resenje: Pre finalnog pakovanja, proverite da su svi debug vizualizacioni modovi iskljuceni. UE5 ih automatski iskljucuje u Shipping build-u, ali Development build moze da ih zadrzi.

44.12.6 Neoptimizovani Cull Distance Volumes

Problem: Imate Cull Distance Volume koji pokriva celu mapu sa istim podesavanjima. Razliciti delovi mape imaju razlicite potrebe.

Resenje: Koristite vise Cull Distance Volumes sa razlicitim podesavanjima za razlicite zone. Gusti gradski delovi trebaju agresivniji culling, dok otvoreni tereni trebaju manje agresivan.


44.13 Checklist za optimizaciju culling-a

Evo prakticne checkliste koju mozete pratiti kada optimizujete culling u vasem projektu:

Pre-produkcija:

Produkcija:

QA / Optimizacija:


44.14 Konzolne komande -- Sveobuhvatna referenca

Ovde su sve relevantne konzolne komande za rad sa culling-om u UE5, organizovane po kategorijama:

Frustum Culling:

// Frustum culling je uvek ukljucen i ne moze se iskljuciti
// Ali mozete videti njegove efekte:
FreezeRendering              // Toggle zamrzavanja renderovanja
stat initviews               // Prikaz vremena za visibility testove

Distance Culling:

r.ViewDistanceScale 1.0      // Globalni skaler za sve cull distances
                              // 0.5 = upola kraci cull distance
                              // 2.0 = duplo duzi cull distance
                              // Korisno za scalability settings

foliage.CullDistanceScale 1.0 // Poseban skaler za foliage

Precomputed Visibility:

show precomputedvisibility    // Vizualizacija celija
r.PrecomputedVisibilityWarning 1 // Upozorenja za probleme

Occlusion Culling:

r.HZBOcclusion 1             // Hierarchical Z-Buffer occlusion (on/off)
r.AllowOcclusionQueries 1    // Hardware occlusion queries (on/off)
r.SO.Enable 1                // Software Occlusion (on/off)
r.SO.BufferSize 256           // Software Occlusion buffer velicina

Nanite:

r.Nanite.MaxPixelsPerEdge 1.0 // LOD agresivnost
stat Nanite                    // Nanite statistike
r.Nanite.Visualize.Overview 1  // Nanite vizualizacija

Debugging:

FreezeRendering               // Zamrzni/odmrzni renderovanje
show bounds                    // Prikazi bounding box-ove
stat scenerendering            // Rendering statistike
stat initviews                 // Visibility statistike
ProfileGPU                     // GPU profiler
r.VisualizeOccludedPrimitives 1 // Vizualizacija occluded objekata

Scalability (kvalitet vs. performanse):

sg.ViewDistanceQuality 3      // 0=Low, 1=Medium, 2=High, 3=Epic, 4=Cinematic
sg.FoliageQuality 3           // Isto za foliage

44.15 Odnos sa World Partition sistemom

Kao sto smo pomenuli ranije (i detaljno objasnili u Poglavlju 32), World Partition i culling su komplementarni sistemi:

Aspekt World Partition Culling
Sta radi Kontrolise koji delovi sveta su ucitani u memoriju Kontrolise koji ucitani objekti se renderuju
Granularnost Grid celije (stotine/hiljade metara) Individualni objekti/klasteri
Uticaj na memoriju Da -- ne ucitava objekte u RAM Ne -- objekti ostaju u memoriji
Uticaj na renderovanje Indirektno (manje ucitanih = manje za render) Direktno (eksplicitno skipuje renderovanje)
Latencija promene Visoka (streaming zahteva vreme) Niska (per-frame odluka)

Kako rade zajedno:

  1. World Partition odredjuje koji "komadi" sveta su ucitani (bazirano na streaming distance)
  2. Od ucitanih objekata, culling odredjuje koji se renderuju (bazirano na frustum, distance, occlusion)
  3. Streaming distance treba da bude veci od cull distance-a da bi objekti bili spremni pre nego sto postanu vidljivi
// Primer: 
// World Partition streaming distance: 100.000 (1km)
// Cull Distance Volume max draw distance za taj tip: 70.000 (700m)
// 
// Objekat na 800m udaljenosti:
// - Ucitan u memoriju (800m < 1000m streaming distance) ✓
// - Ali nije renderovan (800m > 700m cull distance) ✓
//
// Kada igrac pridje na 600m:
// - Objekat je vec u memoriji (nema streaming delay-a)
// - Sada se renderuje (600m < 700m cull distance) ✓

44.16 Culling u kontekstu celokupnog rendering pipeline-a

Da biste u potpunosti razumeli gde culling "zivi" u rendering pipeline-u, evo siroke slike:

[Game Thread]
    |
    +-- Tick svih Actor-a
    +-- Animacije, fizika, AI
    +-- Priprema scene za renderovanje
    |
[Render Thread]
    |
    +-- [CULLING FAZA]
    |   +-- Distance Culling
    |   +-- Frustum Culling
    |   +-- Precomputed Visibility
    |   +-- Occlusion Query rezultati (iz prethodnog frame-a)
    |   +-- Kreiranje liste vidljivih objekata
    |
    +-- [SETUP FAZA]
    |   +-- Sortiranje objekata po materijalu
    |   +-- Priprema draw call-ova
    |   +-- Dynamic instancing/batching
    |
    +-- [SLANJE GPU-U]
    |   +-- Command buffer submission
    |
[GPU]
    |
    +-- [DEPTH PRE-PASS]
    |   +-- Renderuj dubinu svih neprozirnih objekata
    |   +-- Generisi HZB za occlusion
    |
    +-- [NANITE CULLING] (za Nanite mesheve)
    |   +-- Instance culling
    |   +-- Per-cluster frustum + occlusion culling (Two-pass)
    |   +-- Nanite rasterization
    |
    +-- [BASE PASS]
    |   +-- Renderuj boje, normale, materijale
    |
    +-- [LIGHTING]
    |   +-- Shadow maps (sa sopstvenim cullingom!)
    |   +-- Deferred lighting
    |
    +-- [POST-PROCESSING]
    |   +-- Bloom, tone mapping, anti-aliasing, itd.
    |
    +-- [OCCLUSION QUERIES]
        +-- Posalji query-je za sledeci frame

Kao sto vidite, culling se desava rano u pipeline-u (i na CPU i na GPU) i direktno utice na kolicinu posla koji ostatak pipeline-a mora da obavi.


44.17 Performansne implikacije -- Brojevi iz prakse

Da bismo ilustrovali koliko culling zaista znaci, evo nekih tipicnih brojeva (napomena: ovi brojevi su okvirni i zavise od konkretne scene i hardvera):

CPU uticaj:

Metrika Bez cullinga Sa cullingom Usteda
Draw calls po frame-u 15.000 3.000 80%
CPU render thread vreme 22ms 6ms 73%
Visibility determination 0ms 0.5ms Cost cullinga

Da, culling sam po sebi ima cost (0.5ms u ovom primeru), ali ustedevi su ogromne (16ms manje na render thread-u).

GPU uticaj:

Metrika Bez cullinga Sa cullingom Usteda
Trouglova po frame-u 50M 8M 84%
Vertex shader vreme 4ms 0.8ms 80%
Rasterization vreme 6ms 1.5ms 75%
Pixel shader vreme 12ms 4ms 67%
Ukupno GPU frame time 22ms 6.3ms 71%

Nanite dodatan uticaj:

Metrika Tradicionalni culling Nanite culling Usteda
Vidljivi trouglovi 8M 3M 62.5%
Nanite culling cost - 0.3ms Cost Nanite cullinga

Nanite dodatno smanjuje broj trouglova jer radi per-cluster culling i automatski LOD, sto tradicionalni culling ne moze da postigne na tom nivou granulariteta.


44.18 Cross-reference sa drugim poglavljima

Culling je tema koja se prepice sa mnogim drugim temama u ovoj knjizi:


44.19 Tabela kljucnih pojmova

Termin Objasnjenje
Culling Proces odbacivanja objekata koji ne treba da se renderuju, radi ustede CPU i GPU resursa.
Frustum Culling Odbacivanje objekata koji su van vidnog polja kamere (view frustum). Automatski u UE5.
Distance Culling Odbacivanje objekata koji su dalje od definisane maksimalne udaljenosti od kamere.
Cull Distance Volume UE5 Volume actor koji definise pravila za distance culling na osnovu velicine objekata.
Occlusion Culling Odbacivanje objekata koji su zaklanjeni (occluded) drugim objektima i stoga nevidljivi.
Occluder Objekat koji zaklanja druge objekte (npr. zid).
Occludee Objekat koji je potencijalno zaklonjen od strane occluder-a.
Precomputed Visibility Offline izracunata vidljivost za staticne scene, cuvana kao bitmaska po celiji prostora.
Software Occlusion Culling CPU-bazirano occlusion testiranje koristeci pojednostavljen depth buffer.
Hardware Occlusion Queries GPU upiti koji testiraju da li bi bounding box objekta bio vidljiv na ekranu.
HZB (Hierarchical Z-Buffer) Hijerarhijska verzija depth buffer-a (mipmap lanac), koriscena za efikasno occlusion testiranje.
Nanite Cluster Culling Per-cluster GPU-driven culling specifican za Nanite mesh-eve, sa two-pass pristupom.
Bounding Box (AABB) Axis-Aligned Bounding Box -- najmanji pravougaonik poravnat sa koordinatnim osama koji obuhvata ceo mesh. Koristi se za brze culling testove.
Bounding Sphere Najmanji krug (sfera) koji obuhvata ceo mesh. Alternativa AABB-u za culling testove.
Draw Call Komanda CPU-a GPU-u da renderuje odredjenu geometriju sa odredjenim materijalima. Svaki draw call ima overhead.
Overdraw Situacija gde se isti piksel na ekranu renderuje vise puta jer se objekti preklapaju u dubini.
View Frustum Zarubljena piramida koja opisuje vidno polje kamere, definisana sa 6 ravni.
PVS (Potentially Visible Set) Skup objekata koji su potencijalno vidljivi iz odredjene tacke ili oblasti u prostoru.
FreezeRendering UE5 komanda koja zamrzava renderovanje na trenutnoj poziciji kamere, omogucavajuci kretanje po sceni radi debugovanja.
LOD (Level of Detail) Tehnika koriscenja pojednostavljenih verzija mesh-eva na vecim udaljenostima od kamere.
HLOD (Hierarchical LOD) Tehnika gde se grupa objekata na velikoj udaljenosti zamenjuje jednim pojednostavljenim mesh-om.
Two-Pass Occlusion Nanite-ov pristup gde se u prvom prolazu koristi HZB iz prethodnog frame-a, a u drugom prolazu se koristi HZB generisan u prvom prolazu, cime se eliminise latencija.
Screen-Size Culling Odbacivanje objekata/klastera koji zauzimaju premalo piksela na ekranu da bi bili vizuelno znacajni.
World Partition UE5 sistem za streaming delova otvorenog sveta, komplementaran sa cullingom.

44.20 Korisni linkovi i dodatno citanje

Zvanicna Unreal Engine dokumentacija:

Tehnicke prezentacije i blogovi:

Korisni YouTube kanali:


Rezime poglavlja

U ovom poglavlju smo prosli kroz kompletan culling sistem u Unreal Engine 5:

  1. Frustum Culling je automatski i besplatan -- odbacuje sve sto je van vidnog polja kamere. Kljuc efikasnosti je pravilna velicina bounding box-ova.

  2. Distance Culling je jednostavan ali mocan alat -- preko per-actor settings-a i Cull Distance Volumes mozete fino kontrolisati na kojoj udaljenosti objekti nestaju.

  3. Precomputed Visibility je idealan za interior scene sa mnogo occlusion-a -- offline build izracunava vidljivost i runtime lookup je skoro besplatan.

  4. Software Occlusion Culling radi na CPU bez latencije, ali je ogranicen u preciznosti i skalabilnosti.

  5. Hardware Occlusion Queries su precizne ali imaju problem latencije od 1-2 frame-a. HZB (Hierarchical Z-Buffer) je napredna varijanta koju UE5 preferira.

  6. Nanite Per-Cluster Culling je revolucija -- GPU-driven, per-cluster granularitet, two-pass pristup bez latencije. Radi samo za Nanite-enabled mesh-eve.

  7. Sve ove tehnike rade zajedno kao kaskadni filteri -- svaka faza smanjuje posao za sledecu.

  8. Za debugovanje koristite FreezeRendering, show bounds, stat scenerendering, stat initviews i Nanite vizualizacione modove.

Culling nije glamurozna tema -- nema vizuelno impresivnih rezultata kao post-processing efekti ili napredni materijali. Ali bez pravilnog culling-a, nijedna od tih glamuroznih stvari ne bi bila moguca pri prihvatljivom frame rate-u. Culling je temelj na kome se gradi svaka performantna igra, i razumevanje ovih tehnika ce vam pomoci da pravite scene koje izgledaju sjajno i rade glatko.

U sledecem poglavlju, nastavicemo sa optimizacijom i pogledacemo kako profilisati i optimizovati shader kompleksnost i GPU workload.


Kraj Poglavlja 44