Poglavlje 45: Level of Detail (LOD)

Poglavlje 45: Level of Detail (LOD)

U ovom poglavlju razumecete kako igre i real-time aplikacije prikazuju milione objekata na ekranu a da pri tom odrzavaju stabilan frame rate -- koristeci sistem koji je star skoro koliko i sama 3D grafika, ali koji i danas ostaje jedan od najvaznijih alata u arsenalu svakog engine-a. Naucicete kako Mesh LOD radi na diskretnom i kontinualnom nivou, kako HLOD spaja cele grupe udaljenih objekata, kako Nanite eliminise potrebu za tradicionalnim LOD-ovima za podrzane mesheve, kako Material LOD i Shadow LOD dodatno stedite resurse, kako se bore protiv vizuelnih artefakata pri tranzicijama, i kako sve to izgleda u praksi unutar Unreal Engine 5. Ovo je poglavlje koje spaja znanje iz vise prethodnih poglavlja u koherentnu celinu.


Uvod: Zasto crtati ono sto ne vidite?

Zamislite da stojite u centru velikog grada u vasoj igri. Ispred vas, na pet metara, stoji fontana -- predivan model sa 200.000 trouglova, detaljnim ornamentima, vodenim kanalima, sitnm reliefima na kamenu. Svaki trougao se vidi. Svaki detalj doprinosi vizuelnom kvalitetu.

A sada pogledajte ulicu levo. Na 800 metara, vidite zgradu. Na ekranu zauzima mozda 30 piksela. Ima 150.000 trouglova. Koliko tih trouglova zapravo doprinosi onom sto vidite na ekranu? Mozda 50. Mozda manje. GPU procesira svih 150.000, vertex shader radi za svaki vertex, rasterizer obradjuje svaki trougao -- i ogromna vecina tih trouglova se projicira na isti piksel ili na nista.

Ovo je fundamentalno rasipanje. I ovo rasipanje se multiplicira: u tipicnom open-world svetu imate hiljade objekata na razlicitim rastojanjima. Vecina njih je daleko od kamere. Ako svaki renderujete u punoj rezoluciji, vas GPU ce poginuti pod teretom geometrije koja nikome nista ne znaci.

Level of Detail (LOD) je resenje za ovaj problem. Ideja je elegantno jednostavna:

Prikazuj objekte sa manje detalja kada su dalje od kamere, jer na tim rastojanjima detalji ionako nisu vidljivi.

Ova ideja je stara skoro koliko i real-time 3D grafika. James Clark ju je opisao jos 1976. godine u svom radu "Hierarchical geometric models for visible surface algorithms". Od tada, LOD sistemi su postali nezaobilazni deo svakog ozbiljnog 3D engine-a.

Ali LOD nije jedna tehnika -- to je citava familija tehnika. Mesh LOD, Material LOD, Shadow LOD, HLOD, CLOD, Nanite... Svaki pristup resava problem na drugaciji nacin, sa razlicitim trade-off-ovima. U ovom poglavlju cemo proci kroz sve njih, pocevsi od najosnovnijeg.


45.1 Mesh LOD -- Osnova sistema

45.1.1 Sta je Mesh LOD?

Mesh LOD je najosnovnija i najcesca forma Level of Detail-a. Ideja je sledeca: za svaki mesh u vasoj sceni, umesto jedne verzije, imate vise verzija sa razlicitim nivoima detalja. Kada je objekat blizu kamere, koristite verziju sa najvise detalja. Kako se objekat udaljava, prelazite na sve jednostavnije verzije.

LOD 0 (najblize):    50,000 trouglova  -- svi detalji vidljivi
LOD 1 (srednje):     15,000 trouglova  -- manji detalji uklonjeni
LOD 2 (dalje):        5,000 trouglova  -- samo silueta i veliki oblici
LOD 3 (najdalje):     1,000 trouglova  -- gruba aproksimacija oblika

      LOD 0          LOD 1          LOD 2          LOD 3
    ┌────────┐     ┌────────┐     ┌────────┐     ┌────────┐
    │xxxxxx  │     │xxxx    │     │xx      │     │x       │
    │xxxxxxxx│     │xxxxxx  │     │xxxx    │     │xx      │
    │xxxxxxxx│     │xxxxxxx │     │xxxx    │     │xx      │
    │xxxxxxxx│     │xxxxxx  │     │xxx     │     │x       │
    │xxxxxx  │     │xxxx    │     │xx      │     │x       │
    └────────┘     └────────┘     └────────┘     └────────┘
     Blizu          Srednje         Dalje          Najdalje

Svaka od ovih verzija se u UE5 zove LOD level (LOD nivo). LOD 0 je uvek originalni, najdetaljniji mesh. LOD 1, 2, 3... su progresivno jednostavniji.

45.1.2 Diskretni LOD (Discrete LOD)

Tradicionalni LOD sistemi, ukljucujuci onaj u UE5 za non-Nanite mesheve, koriste diskretni LOD. To znaci da imate konacni, fiksni broj LOD verzija, i engine u svakom trenutku prikazuje tacno jednu od njih.

Kako engine bira koji LOD da prikaze? Na osnovu screen size-a -- koliki procenat ekrana mesh zauzima u datom trenutku.

Screen size (procenat ekrana koji bounding sphere zauzima):

100% ─────────────────────────────────── LOD 0
 50% ────────────────────────────        (tranzicija)
 25% ──────────────────                  LOD 1
 12% ────────────                        (tranzicija)
  6% ──────                              LOD 2
  3% ────                                (tranzicija)
  1% ──                                  LOD 3
0.5% ─                                   (cull - ne crta se uopste)

Kljucna stvar: tranzicije nisu bazirane na apsolutnoj udaljenosti od kamere, vec na velicini na ekranu (screen size). Ovo je vazno jer isti objekat moze izgledati razlicito velik zavisno od ugla kamere, field of view-a, i rezolucije ekrana. Kocka koja je 100 metara daleko moze biti ogromna ako je i sama ogromna (planina), ili siciusna ako je to kutija za cipele. Screen size uzima sve to u obzir.

45.1.3 Kako UE5 racuna Screen Size

UE5 koristi bounding sphere mesh-a za izracunavanje screen size-a. Formula je priblizno:

ScreenSize = SphereRadius / (Distance * ProjectionScale)

Gde je:

Ovo znaci:

U editoru, mozete videti screen size threshold za svaki LOD u Static Mesh Editoru pod "LOD Settings". Svaki LOD ima polje "Screen Size" koje odredjuje na kom screen size-u engine prelazi na taj LOD.

Primer iz UE5 Static Mesh Editora:

LOD 0:  Screen Size = 1.0     (prikazuje se kada je screen size >= 1.0)
LOD 1:  Screen Size = 0.5     (prikazuje se kada je screen size >= 0.5 i < 1.0)
LOD 2:  Screen Size = 0.25    (prikazuje se kada je screen size >= 0.25 i < 0.5)
LOD 3:  Screen Size = 0.125   (prikazuje se kada je screen size >= 0.125 i < 0.25)
Cull:   Screen Size = 0.01    (ne prikazuje se kada je screen size < 0.01)

45.1.4 LOD u praksi: Koliko LOD-ova treba?

Ovo zavisi od vise faktora, ali evo opstih smernica:

Mali rekviziti (kutije, boce, stolice): 2-3 LOD-a su obicno dovoljni. LOD 0 sa punim detaljima, LOD 1 sa 30-50% trouglova, i opcioni LOD 2 sa 10-15% trouglova.

Srednji objekti (namestaj, vozila, malo drvece): 3-4 LOD-a. LOD 0 je pun detalj, LOD 1 oko 40%, LOD 2 oko 15%, LOD 3 oko 5%.

Veliki objekti (zgrade, velike stene, veliko drvece): 4-5 LOD-ova. Ovi objekti su vidljivi na velikom rasponu rastojanja, pa vam treba vise nivoa da pokriju ceo raspon.

Hero objekti (glavni lik, kljucna vozila): Cesto samo 1-2 LOD-a, jer su uglavnom blizu kamere. Neki projekti cak koriste samo LOD 0 za hero objekte.

Tipicna redukcija trouglova po LOD nivou:

LOD nivo Tipican % trouglova Namena
LOD 0 100% Blizu kamere, pun detalj
LOD 1 30-50% Srednje rastojanje
LOD 2 10-20% Daleko rastojanje
LOD 3 3-8% Veoma daleko
LOD 4 1-3% Horizont / jedva vidljivo

Zapamtite: cilj LOD-a nije da objekat izgleda "losije" -- cilj je da izgleda identično na tom rastojanju sa manje trouglova. Ako igrac moze da primeti razliku izmedju LOD 0 i LOD 1 na rastojanju gde se LOD 1 koristi, vas LOD 1 je previse agresivno redukovan ili se aktivira prerano.


45.2 Kreiranje LOD-ova: Automatski vs Rucni

45.2.1 Automatska generacija LOD-ova u UE5

UE5 ima ugradjen sistem za automatsko generisanje LOD-ova. Ovo je najcesci pristup jer ne zahteva nikakav dodatan rad od umetnika.

Kako podesiti automatske LOD-ove

  1. Otvorite Static Mesh u editoru
  2. Idite na LOD Settings panel
  3. Kliknite Auto Generate LODs ili podesite Number of LODs
  4. Engine ce generisati LOD nivoe koristeci mesh simplification algoritme

UE5 interno koristi mesh simplification algoritam koji je zasnovan na Quadric Error Metric (QEM) pristupu (koji smo pomenuli u poglavlju 03 kada smo govorili o topologiji i mesh operacijama). QEM algoritam radi tako sto iterativno kolapsira ivice (edge collapse) od najmanje vaznih ka najvaznijim, minimizujuci vizuelnu gresku pri svakom koraku.

Edge Collapse: Osnovna operacija mesh simplifikacije

Pre:     A ─── B ─── C          Posle:    A ─── B' ─── C
         │ ╲   │   ╱ │                    │  ╲   │   ╱  │
         │   ╲  │  ╱  │     ──────>       │    ╲  │  ╱   │
         D ─── E ─── F                    D ──── E' ──── F

Vertex B i E se spajaju u jedan vertex (B' ili E'),
dva trougla (ABE i BEF) nestaju, ukupan broj 
trouglova se smanjuje za 2.

Auto LOD podesavanja u UE5

Kada koristite automatsku generaciju, mozete kontrolisati sledece parametre:

Reduction Settings (za svaki LOD nivo):

Parametar Sta radi
Percent Triangles Ciljni procenat trouglova u odnosu na LOD 0
Max Deviation Maksimalna geometrijska devijacija (u world units) od originala
Welding Threshold Rastojanje na kome se bliski verteksi spajaju
Hard Edge Angle Ugao iznad koga se ivica smatra "oštrom" i cuva se
Silhouette Importance Koliko je bitno ocuvati siluetu mesh-a (Low/Normal/High/Highest)
Texture Importance Koliko je bitno ocuvati UV mapping
Shading Importance Koliko je bitno ocuvati smer normala (osvetljenje)

Silhouette Importance je posebno vazan parametar. Na daljim rastojanjima, igrac ne vidi detalje teksture ni fine promene u osvetljenju -- ali vidi siluetu objekta. Drvo cija silueta postane kocka na LOD 2 ce biti veoma primetan artefakt. Zato za organske objekte (drvece, stene, likove) obicno postavljate Silhouette Importance na High ili Highest.

Auto LOD Group Settings

UE5 ima koncept LOD Group-a -- predefinisanih profila koji odredjuju default LOD ponasanje za razlicite tipove mesh-eva. Ovi se nalaze u Project Settings > Engine > Rendering > Level of Detail:

LOD Group Tipicna primena Default broj LOD-ova
LargeWorld Veliki tereni, planine 4-5
Large Zgrade, velike stene 4
Medium Nameštaj, vozila, drvece 3-4
Small Mali rekviziti, kutije 2-3
SmallProp Sitni dekorativni objekti 2
Foliage Vegetacija 3-4

Mozete kreirati i custom LOD grupe za specifičan pipeline vaseg projekta. Ovo je posebno korisno kada imate veliki tim i zelite konzistentan LOD kvalitet kroz ceo projekat -- umesto da svaki umetnik rucno podesava LOD parametre, svi koriste iste LOD grupe.

45.2.2 Rucna izrada LOD-ova

Automatska generacija je odlicna za vecinu slucajeva, ali nekada vam treba vise kontrole. Rucni LOD-ovi se prave u DCC alatu (Blender, Maya, 3ds Max, ZBrush) i importuju kao deo mesh-a.

Kada koristiti rucne LOD-ove?

  1. Kada automatski LOD unistava kljucne oblike -- Mesh simplification algoritmi ne razumeju semantiku vašeg objekta. Ne znaju da je "usta" karaktera vaznija od zadnje strane glave. Rucni LOD vam daje kontrolu nad tim sta se cuva a sta se uklanja.

  2. Kada je silueta kriticna -- Za objekte koji su ikonicki za vasu igru (oruzje glavnog lika, kljucno vozilo), rucni LOD garantuje da silueta ostaje prepoznatljiva na svim rastojanjima.

  3. Kada zelite topology promene -- Automatski LOD samo uklanja trouglove. Rucni LOD moze potpuno promeniti topologiju -- na primer, prozor koji je na LOD 0 geometry moze na LOD 2 postati samo tekstura na ravnoj povrsini.

  4. Imposter/Billboard LOD -- Na veoma velikim rastojanjima, 3D mesh moze biti zamenjen 2D slikom (billboard) ili imposterom. Ovo zahteva rucnu pripremu.

Kako importovati rucne LOD-ove u UE5

Postoje dva pristupa:

Pristup 1: Imenovanje u FBX fajlu

U DCC alatu imenujete mesheve sa sufiksom _LOD0, _LOD1, _LOD2, itd:

Tree_LOD0     (pun mesh, 50.000 trouglova)
Tree_LOD1     (srednji, 12.000 trouglova)
Tree_LOD2     (jednostavan, 3.000 trouglova)
Tree_LOD3     (veoma jednostavan, 500 trouglova)

Eksportujete sve u jedan FBX fajl. Pri importu u UE5, engine automatski prepoznaje LOD nivoe na osnovu sufiksa.

Pristup 2: Naknadno dodavanje LOD-ova

Otvorite vec importovan mesh u UE5, idite na LOD Settings, i koristite Import LOD dugme za dodavanje LOD nivoa iz zasebnih FBX fajlova.

Oba pristupa su potpuno validna. Prvi je pogodniji za pipeline gde jedan umetnik pravi sve LOD-ove. Drugi je pogodniji za iterativni workflow gde LOD-ove pravite ili dorađujete naknadno.

Detaljan opis importa LOD-ova kroz asset pipeline obradjujemo u poglavlju 37.

45.2.3 Hibridni pristup: Automatski + Rucni

U praksi, mnogi projekti koriste hibridni pristup:

Ovo daje dobar balans izmedju kvaliteta (rucni LOD 1 za srednje rastojanje gde su artefakti najvidljiviji) i produktivnosti (automatski LOD-ovi za daleke nivoe gde je kvalitet manje kritican).


45.3 LOD tranzicije: Popping, Dithering i Cross-Fade

45.3.1 Problem: Popping

Najocigledniji problem sa diskretnim LOD-om je popping -- trenutna, vidljiva promena kada engine prebaci sa jednog LOD nivoa na drugi. Igrac hoda ka objektu, i u jednom trenutku objekat "skoci" -- naglo postane detaljniji (ili manje detaljan ako se udaljava).

Frame N:     Prikazuje LOD 2 (5,000 trouglova)
Frame N+1:   Prikazuje LOD 1 (15,000 trouglova)  <-- nagla promena!

Igrac vidi:  SKOK! Objekat se odjednom "poboljsao"

Popping je posebno primetan na:

45.3.2 Resenje 1: Dithered Transition (Dithered LOD)

UE5 podrzava dithered transition izmedju LOD nivoa. Umesto nagle promene, engine koristi dither pattern da postepeno "blenda" dva LOD nivoa.

Kako radi:

  1. Kada screen size padne u tranzicionu zonu izmedju dva LOD-a, engine renderuje oba LOD-a
  2. Na svakom pikselu, koristi dither pattern (structurirani noise) da odluci da li prikazuje piksel iz starog ili novog LOD-a
  3. Tokom trajanja tranzicije, sve vise piksela prelazi na novi LOD
  4. Na kraju tranzicije, stari LOD se potpuno odbacuje
Dithered Transition (vizuelno):

Start:     LOD 1: ████████████████   LOD 2: ░░░░░░░░░░░░░░░░
           LOD 1: 100%               LOD 2: 0%

25%:       LOD 1: ████░███░███████   LOD 2: ░░░░█░░░█░░░░░░░
           LOD 1: 75%                LOD 2: 25%

50%:       LOD 1: ██░░██░░██░░██░░   LOD 2: ░░██░░██░░██░░██
           LOD 1: 50%                LOD 2: 50%

75%:       LOD 1: █░░░█░░░█░░░█░░░   LOD 2: ░███░███░███░███
           LOD 1: 25%                LOD 2: 75%

Kraj:      LOD 1: ░░░░░░░░░░░░░░░░   LOD 2: ████████████████
           LOD 1: 0%                 LOD 2: 100%

Prednosti dithered tranzicije:

Mane:

Kako aktivirati Dithered LOD u UE5

U Static Mesh editoru, za svaki LOD nivo mozete podesiti:

  1. LOD Settings > LOD [N] > Screen Size -- na kom screen size-u se aktivira ovaj LOD
  2. Otvorite materijal mesh-a u Material Editoru
  3. Pod Material > Details > Material omogucite Dithered LOD Transition
  4. Opciono, podesite Dithered LOD Transition Duration -- koliko dugo traje tranzicija

Takodje mozete globalno kontrolisati LOD tranzicije na nivou mesh-a u Static Mesh Editoru > LOD Settings:

LOD Settings:
├── Num LODs: 4
├── LOD 0
│   └── Screen Size: 1.0
├── LOD 1
│   └── Screen Size: 0.4
├── LOD 2
│   └── Screen Size: 0.15
├── LOD 3
│   └── Screen Size: 0.05
└── Minimum LOD: -1 (koristi sve LOD-ove)

45.3.3 Resenje 2: Cross-Fade Transition

Cross-fade je tehnika koja renderuje oba LOD-a istovremeno i blenduje ih koristeci alpha blending, za razliku od dithered pristupa koji koristi binarnu per-pixel selekciju.

Cross-Fade:

LOD 1 renderovan sa alpha = (1 - t)
LOD 2 renderovan sa alpha = t

gde je t = progres tranzicije od 0.0 do 1.0

Prednosti cross-fade:

Mane:

U UE5, cross-fade tranzicije za Mesh LOD nisu direktno podrzane "iz kutije" kao jednostavan checkbox na nacin na koji je dithered. Medjutim, mozete ih implementirati kroz custom materijal logiku (World Position Offset blending ili opacity masking sa postepenom tranzicijom). U praksi, dithered tranzicija je dominantan pristup u UE5 projektima jer je jeftinija i dovoljno dobra za vecinu slucajeva.

45.3.4 Minimiziranje tranzicionih artefakata

Bez obzira koji metod tranzicije koristite, postoji nekoliko generalnih strategija za minimiziranje vizuelnih artefakata:

1. Dobro napravljen LOD je najbolja prevencija. Ako LOD 1 izgleda dovoljno slicno LOD 0 na rastojanju gde se tranzicija desava, promena ce biti minimalno primetna cak i bez ikakvog blending-a.

2. Postepene screen size pragove. Ne pravite prevelike skokove u redukciji trouglova izmedju susednih LOD nivoa. Skok sa 50.000 na 3.000 trouglova je ocigledniji od skoka sa 50.000 na 25.000 pa na 8.000 pa na 3.000.

3. Sacuvajte siluetu. Promene u silueti su ono sto ljudsko oko najlakse detektuje. LOD koji menja siluetu je vise primetan od LOD-a koji gubi unutrasnje detalje.

4. Konzistentne UV koordinate. Ako se UV mapping drasticno menja izmedju LOD-ova, tekstura ce "kliziti" prilikom tranzicije. Ovo je posebno primetan artefakt.

5. Koristite LOD Bias za fine-tuning. Ako jedan konkretan mesh ima primetan popping, mozete mu smanjiti screen size threshold za tranziciju (da se tranzicija desi dalje od kamere, gde je manje primetna).

6. Temporal upsampling pomaze. TSR (poglavlje 33) prirodno "ublazava" dithered tranzicije jer njegov temporal filter resolve-uje dither pattern kroz vise frejmova.


45.4 LOD Bias i Screen Size Factor

45.4.1 Sta je LOD Bias?

LOD Bias je globalni ili per-objekat parametar koji pomera LOD selekciju. Pozitivan LOD Bias forsira nizi LOD (manje detalja) ranije, negativan LOD Bias forsira visi LOD (vise detalja) duze.

Bez LOD Bias:
  LOD 0 ──────|── LOD 1 ──────|── LOD 2 ──────|── LOD 3

Sa LOD Bias +1 (manji detalji ranije):
  LOD 0 ──|── LOD 1 ──|── LOD 2 ──────|── LOD 3

Sa LOD Bias -1 (vise detalja duze):
  LOD 0 ──────────|── LOD 1 ──────────|── LOD 2 ──|── LOD 3

Gde se podesava LOD Bias?

  1. Globalno (cvar): r.StaticMeshLODDistanceScale -- skalira LOD rastojanja za sve staticne mesheve u sceni. Vrednost 1.0 je default. Vrednost 2.0 znaci da ce se LOD tranzicije desavati na duplo manjem rastojanju (agresivniji LOD). Vrednost 0.5 znaci da ce se desavati na duplo vecem rastojanju (manje agresivan LOD).

  2. Per-Component: Na svakom Static Mesh Component-u mozete podesiti Forced LOD Model (fiksiraj konkretan LOD) ili LOD Bias koji dodaje offset na LOD selekciju.

  3. Per-Mesh: U Static Mesh editoru mozete podesiti LOD Distance Factor za individualne LOD nivoe.

  4. Na nivou kvaliteta (Scalability): UE5 Scalability sistem moze automatski podesavati LOD bias na osnovu kvaliteta grafike. Na "Low" kvalitetu, LOD bias se povecava (agresivniji LOD) da bi se odrzao frame rate na slabijem hardware-u.

45.4.2 Screen Size Factor i Custom pragovi

Screen Size Factor vam daje jos finiju kontrolu nad LOD tranzicijama. Za svaki mesh, mozete podesiti custom screen size pragove za svaki LOD nivo.

Primer: Imate dve stene, obe koriste isti mesh. Ali jedna je u centru scene gde je igrac cesto vidi izbliza, a druga je u pozadini gde nikada ne prilazi. Za pozadinsku stenu, mozete povecati Screen Size Factor na njenom Static Mesh Component-u, sto ce uzrokovati raniji prelazak na nize LOD-ove.

// Blueprint/C++ pristup:
StaticMeshComponent->SetLODScreenSizeScale(1.5f); 
// LOD tranzicije se desavaju 1.5x ranije za ovu komponentu

45.4.3 Minimum LOD i Forced LOD

Minimum LOD je parametar koji ogranicava najnizi LOD nivo koji mesh moze koristiti. Na primer, ako postavite Minimum LOD na 2, mesh ce koristiti LOD 0, LOD 1, ili LOD 2, ali nikada LOD 3 ili LOD 4 -- cak i na veoma velikim rastojanjima.

Ovo je korisno za objekte koji su uvek relativno blizu kamere (prvi plan scene) ili za kvalitetne postavke gde zelite da garantujete minimulan nivo detalja.

Forced LOD fiksiira mesh na specifican LOD nivo, bez obzira na screen size. Ovo se cesto koristi za:

Console komande za LOD kontrolu:

r.StaticMeshLODDistanceScale 2.0      // Globalno agresivniji LOD
r.SkeletalMeshLODBias 1               // LOD bias za skeletal mesheve
r.ForceLOD 2                          // Forsiraj LOD 2 za sve mesheve (debug)
r.ForceLODShadow 3                    // Forsiraj LOD 3 za shadow rendering

45.5 Continuous Level of Detail (CLOD)

45.5.1 Koncept: Progressive Meshes

Do sada smo govorili o diskretnom LOD-u -- imate fiksni set LOD verzija i skaçete izmedju njih. Ali postoji i alternativni pristup: Continuous LOD (CLOD), poznat i kao Progressive Meshes.

CLOD je baziran na radu Hoppe-a iz 1996. godine ("Progressive meshes", SIGGRAPH). Ideja je sledeca: umesto da imate N zasebnih LOD verzija, imate jednu strukturu podataka koja moze da se kontinualno simplifikuje ili usloзni u realnom vremenu.

Diskretni LOD:
                    ┌───────────┐
  50K trouglova ────│   LOD 0   │    SKOK!
                    └───────────┘
                                     ┌───────────┐
  15K trouglova ─────────────────────│   LOD 1   │    SKOK!
                                     └───────────┘
                                                      ┌───────────┐
   5K trouglova ──────────────────────────────────────│   LOD 2   │
                                                      └───────────┘


Kontinualni LOD (CLOD):
                    ┌─────────────────────────────────────────────┐
  50K ──────────────│                                             │
  45K ──────────────│      Glatka, neprekidna redukcija           │
  40K ──────────────│                                             │
  35K ──────────────│      Bilo koji broj trouglova od            │
  30K ──────────────│      max do min, u realnom vremenu          │
  25K ──────────────│                                             │
  20K ──────────────│                                             │
  15K ──────────────│                                             │
  10K ──────────────│                                             │
   5K ──────────────│                                             │
                    └─────────────────────────────────────────────┘

45.5.2 Kako CLOD radi?

CLOD koristi sekvencu vertex split i edge collapse operacija. Polazi se od najjednostavnijeg mesh-a i progresivno se dodaju detalji (vertex split), ili se polazi od najdetaljnijeg i progresivno se uklanjaju (edge collapse).

Edge Collapse (simplifikacija):
    A ─── B      ===>     A'
   / \   / \            / | \
  C   D-E   F          C  D  F
   \ /   \ /            \ | /
    G ─── H               G'

Vertex Split (dodavanje detalja):
    A'             ===>    A ─── B
   / | \                  / \   / \
  C  D  F                C   D-E   F
   \ | /                  \ /   \ /
    G'                     G ─── H

Prednosti CLOD-a:

45.5.3 Zasto se CLOD retko koristi u praksi?

Uprkos elegantnoj teoriji, CLOD ima ozbiljne prakticne probleme:

  1. Runtime CPU cost -- Dinamicko menjanje geometrije zahteva znacajan CPU rad za svaki frejm. Edge collapse/vertex split operacije, azuriranje index buffer-a, rekalkulacija normala -- sve to kosta.

  2. GPU nekompatibilnost -- Moderni GPU-ovi su optimizovani za staticne buffer-e. Stalno menjanje vertex i index buffer-a unistava efikasnost GPU pipeline-a (cache invalidation, buffer upload overhead).

  3. Memorijski overhead -- Progressive mesh struktura zahteva dodaten memoriju za cuvanje redosleda operacija, susednosti, i ostalih metapodataka.

  4. Kompleksnost implementacije -- Pravilna implementacija CLOD-a sa robusnim rukovanjem T-junction-ima, normal seam-ovima, i multi-material mesh-evima je izuzetno kompleksna.

Upravo iz ovih razloga, vecina modernih engine-a (ukljucujuci UE5 za non-Nanite mesheve) koristi diskretni LOD. CLOD je ostao vise akademski koncept nego industrijski standard.

Ali -- postoji jedan sistem koji uzima sustinu CLOD ideje i implementira je na fundamentalno drugaciji nacin. Taj sistem se zove Nanite.


45.6 Nanite kao automatski LOD

45.6.1 Nanite: CLOD ideja, revolucionarna implementacija

Ako ste procitali poglavlje 30, vec znate kako Nanite radi. Ali hajde da ga sada posmatramo specifično kroz prizmu LOD-a, jer Nanite je u sustini najnapredniji LOD sistem ikada napravljen za real-time rendering.

Podsetimo se kljucnih koncepata:

  1. Mesh se deli na klastere od ~128 trouglova
  2. Klasteri se organizuju u hijerarhiju -- grupe klastera se spajaju i simplifikuju u klastere viseg LOD nivoa
  3. Za svaki frejm, engine bira optimalan LOD nivo za svaki klaster -- ne za ceo mesh, vec za svaki individualni klaster
  4. Tranzicije su nevidljive jer se desavaju na nivou klastera koji su ispod praga percepcije
Tradicionalni Mesh LOD:

Ceo mesh prelazi sa LOD 0 na LOD 1 odjednom:
    ┌───────────────────────────┐
    │ LOD 0  LOD 0  LOD 0  LOD 0│  ──>  ┌───────────────────────────┐
    │ LOD 0  LOD 0  LOD 0  LOD 0│       │ LOD 1  LOD 1  LOD 1  LOD 1│
    │ LOD 0  LOD 0  LOD 0  LOD 0│       │ LOD 1  LOD 1  LOD 1  LOD 1│
    └───────────────────────────┘       └───────────────────────────┘
                  SKOK!


Nanite per-cluster LOD:

Razliciti klasteri mogu biti na razlicitim LOD nivoima:
    ┌───────────────────────────┐
    │ LOD 0  LOD 0  LOD 1  LOD 2│   Blizi klasteri su detaljniji,
    │ LOD 0  LOD 1  LOD 1  LOD 2│   dalji su jednostavniji.
    │ LOD 1  LOD 1  LOD 2  LOD 3│   Nema naglog skoka.
    └───────────────────────────┘

45.6.2 Zasto Nanite eliminise tradicionalne LOD artefakte

Nema popping-a. Zato sto se tranzicija desava na nivou klastera od ~128 trouglova, vizuelna promena je toliko mala da je ljudsko oko ne moze detektovati. Ovo je kljucna razlika u odnosu na tradicionalni diskretni LOD gde se ceo mesh menja odjednom.

Nema potrebe za rucnim LOD-ovima. Nanite automatski gradi celu LOD hijerarhiju tokom importa. Umetnik importuje mesh u punoj rezoluciji i ne mora da razmislja o LOD-ovima.

Precizan budzet trouglova. Nanite renderuje priblizno onoliko trouglova koliko je piksela na ekranu koji taj mesh pokriva -- sto je teoretski optimalan odnos. Ne moze biti bolje od "jedan trougao po pikselu" jer ispod toga gubite geometrijski detalj.

Adaptivan po prostoru. Deo mesh-a koji je blize kameri moze biti na visem LOD nivou od dela koji je dalje -- cak i ako je to isti mesh. Zamislite veliku stenu: deo koji je ispred vas je na LOD 0, a deo iza je na LOD 4. Tradicionalni LOD ne moze ovo -- ceo mesh mora biti na istom LOD nivou.

45.6.3 Kada Nanite zamenjuje tradicionalne LOD-ove

Za mesheve koji podrzavaju Nanite, tradicionalni Mesh LOD postaje nepotujeban. Ne morate generisati LOD-ove, ne morate podesavati screen size pragove, ne morate se boriti sa popping-om.

Nanite podrzava:

45.6.4 Kada Nanite NIJE dovoljan -- i kada jos uvek trebate LOD-ove

Uprkos svojoj moci, Nanite ne pokriva sve slucajeve. Evo situacija gde vam tradicionalni LOD sistem i dalje treba:

1. Skeletal Meshes (animirani likovi)

Nanite ne podrzava skeletal mesheve. Likovi, NPC-ovi, neprijatelji, zivotinje -- svi oni i dalje zahtevaju tradicionalne LOD-ove.

Skeletal Mesh LOD za humanoidni lik:

LOD 0: 65,000 trouglova   Bone count: 120   Blizu kamere
LOD 1: 25,000 trouglova   Bone count:  60   Srednje rastojanje
LOD 2:  8,000 trouglova   Bone count:  30   Daleko
LOD 3:  2,000 trouglova   Bone count:  15   Veoma daleko (crowds)

Primetite: ne samo trouglovi, vec i bone count se smanjuje na visim LOD-ovima!
Manje kostiju = manje skinning racunanja = brze.

2. Translucent/Transparent materijali

Nanite ne podrzava transparentne materijale. Staklo, voda, dim, hologrami -- sve to zahteva tradicionalni rendering path sa LOD-ovima.

3. Proceduralna geometrija u runtime-u

Geometrija koja se generise u runtime-u (proceduralni tereni, voxel sistemi) ne moze koristiti Nanite jer Nanite-ova klaster hijerarhija se gradi offline tokom importa.

4. Mobilne platforme

Nanite trenutno ne podrzava mobilne platforme (iOS, Android). Projekti koji targetiraju mobile moraju koristiti tradicionalne LOD-ove za sve mesheve.

5. Stari projekti i legacy sadrzaj

Migracija postojeceg sadrzaja na Nanite zahteva ponovni import i potencijalno re-authoring materijala. Za stare projekte koji vec imaju funkcionalan LOD sistem, prelazak na Nanite mozda nije opravdan.

6. Specijalni vizuelni efekti na blizim LOD-ovima

Ponekad zelite da LOD 0 ima nesto sto nizi LOD-ovi nemaju -- na primer, animirane delove (ventilator koji se vrti, dugmad koja svetle). Ovi efekti se ne mogu izraziti samo geometrijom, vec zahtevaju Blueprint logiku ili posebne materijale po LOD-u. U Nanite sistemu, nemate eksplicitan koncept "LOD 0 vs LOD 1" na koji mozete zakaciti razlicitu logiku.


45.7 Material LOD

45.7.1 Zasto nije dovoljno samo smanjiti geometriju?

Zamislite stenu na velikom rastojanju. LOD sistem je smanjio njen mesh sa 50.000 na 1.000 trouglova. Odlicno, ustedeli ste gomilu vertex processinga. Ali materijal te stene i dalje koristi:

Sav taj pixel shader rad se i dalje izvrsava za svaki piksel koji stena pokriva na ekranu. Na 1.000 metara, stena pokriva mozda 20 piksela -- ali materijal je jednako kompleksan kao da je pokriva 200.000 piksela (doduše, za manje piksela, ali svaki piksel je jednako skup za shader).

Material LOD resava ovaj problem: na vecim rastojanjima, koristite jednostavniji materijal.

45.7.2 Sta se moze pojednostaviti?

Na vecim rastojanjima, odredjeni materijalni efekti postaju nevidljivi. Evo sta tipicno uklanjate:

1. Normal mape -- Na velikom rastojanju, detalji normal mape (sitne neravnine, pore, zarezi) se projiciraju na sub-pixel nivo i postaju nevidljivi. Mozete koristiti jednostavniju normal mapu ili potpuno ravnu normalu.

2. Detail textures -- Teksture koje dodaju "blizu" detalje (pore na kozi, zrna peska, vlakna na tkanini) nemaju smisla na daljini.

3. Parallax Occlusion Mapping -- POM je skup efekat koji simulira dubinu koristeci ray marching u pixel shaderu (poglavlje 19). Na daljini je potpuno nevidljiv. Ovo je jedan od prvih efekata koji treba iskljuciti u Material LOD.

4. Tessellation/Displacement -- Ako koristite hardware tessellation (retko u UE5 jer ga Nanite zamenjuje za vecinu slucajeva), mozete ga smanjiti ili iskljuciti na daljini.

5. Kompleksni blend-ovi -- Materijali koji blenduju 3-4 sloja na osnovu vertex color ili height map mogu na daljini koristiti samo jedan sloj.

6. Subsurface Scattering -- Za materijale koze ili vostka, SSS efekat je nevidljiv na daljini. Mozete ga zamenjiti obicnim diffuse osvetljenjem.

45.7.3 Implementacija Material LOD u UE5

UE5 pruza vise nacina da implementirate Material LOD:

Pristup 1: Quality Switch Node

U Material Editoru, postoji Quality Switch node koji vam omogucava da razlicite materijalne logike koristite za razlicite kvalitete renderovanja (Low, Medium, High, Epic). Ovo nije LOD u klasicnom smislu (ne zavisi od rastojanja), ali je korisno za scalability.

Pristup 2: Per-LOD Material Slots

U UE5, svaki LOD nivo moze imati razlicit set materijala. Ovo je najdirektniji nacin da implementirate Material LOD:

LOD 0: Material_Rock_Full
       - 4K teksture
       - Normal map
       - POM (16 koraka)
       - Detail texture
       - 3-layer blend
       
LOD 1: Material_Rock_Medium
       - 2K teksture
       - Normal map (pojednostavljena)
       - Bez POM
       - Bez detail texture
       - 2-layer blend

LOD 2: Material_Rock_Simple
       - 1K teksture
       - Flat normal
       - Bez POM
       - Bez detail texture
       - Single layer (samo base color + roughness)

Ovo se podesava u Static Mesh editoru: za svaki LOD nivo mozete promeniti koje materijale koristi.

Pristup 3: Distance-Based Material Logic

Unutar jednog materijala mozete koristiti Camera Distance node ili Object Distance node da dinamicki uprosciavate materijal:

Pseudo-logic u Material Editoru:

IF CameraDistance < 50m:
    Koristi POM + Detail Texture + Full Normal Map
ELSE IF CameraDistance < 200m:
    Koristi Normal Map bez POM-a, bez Detail Texture
ELSE:
    Koristi Flat Normal + Base Color Only

Prednost ovog pristupa je sto imate jedan materijal koji se adaptira, umesto vise zasebnih materijala. Mana je sto su branching operacije (if/else) u pixel shader-u relativno skupe -- GPU thread divergence (o cemu smo govorili u poglavlju 08) moze negativno uticati na performanse.

U praksi, kombinacija pristupa 2 (per-LOD material slots) za dramatiöne promene i pristupa 3 (distance-based logic) za suptilne promene daje najbolje rezultate.

45.7.4 Material LOD sa Nanite

Kada koristite Nanite, nemate tradicionalne LOD nivoe na koje mozete vezati razlicite materijale. Medjutim, Nanite materijali i dalje mogu koristiti distance-based logiku u pixel shaderu.

Jedna vazna napomena: Nanite koristi Visibility Buffer (deferred materijal evaluation) sto znaci da se pixel shader izvrsava tacno jednom po vidljivom pikselu. Ovo cini pixel shader cost proporcionalan broju piksela, ne broju trouglova -- sto znaci da je Material LOD manje kriticna za Nanite mesheve u pogledu ukupnog broja shader invokacija, ali i dalje vazna za per-pixel cost.


45.8 Shadow LOD

45.8.1 Zasto senke zahtevaju sopstveni LOD?

Senke su jedno od najskupljih vizuelnih svojstava u real-time renderovanju (detaljno obradjeno u poglavlju 13 i 31). Za generisanje shadow mape, scena se renderuje ponovo iz perspektive svetla -- sto znaci dodatne draw call-ove, dodatni vertex processing, i dodatan rasterization posao.

LOD sistema za glavni rendering pass je jedna stvar. Ali sta je sa senkama? Ako objekat na 500 metara koristi LOD 2 sa 5.000 trouglova za glavni pass, da li treba i senka da koristi 5.000 trouglova?

Cesto ne. Senke su po prirodi manje detaljne od samih objekata -- nemaju teksture, normale, materijale. Samo silueta senke je vazna. Zato ima smisla koristiti jos agresivniji LOD za shadow pass.

45.8.2 Shadow LOD tehnike

1. Koriscenje nizeg LOD-a za shadow rendering

UE5 vam omogucava da specificirate koji LOD nivo da se koristi za shadow rendering, nezavisno od main pass LOD-a:

Console varijabla:
r.Shadow.MaxCSMResolution        // Maksimalna rezolucija CSM-a
r.Shadow.DistanceScale           // Skalira shadow distance
r.ForceLODShadow                // Forsira specifican LOD za senke

Per-component:
StaticMeshComponent->SetShadowLODBias(2);
// Koristi LOD 2 za senke cak i kada je LOD 0 aktivan za main pass

2. Iskljucivanje senki na daljini

Za male objekte na velikim rastojanjima, senke su cesto potpuno nepotrebne. UE5 podrzava Shadow Distance Culling -- automatsko iskljucivanje senki za objekte koji su dalje od odredjenog praga.

Na Static Mesh Component-u:
- Cast Shadow: true
- Shadow Max Draw Distance: 3000.0   // Senke se gasne iznad 3000 unita

Na Point/Spot Light-u:
- Shadow Resolution Scale: 0.5       // Smanjuje rezoluciju shadow mape
- Max Draw Distance: 5000.0          // Svetlo ne crta senke iznad 5000 unita

3. Virtual Shadow Maps i LOD

Virtual Shadow Maps (poglavlje 31) donekle automatizuju Shadow LOD. VSM koristi clipmap strukturu koja prirodno ima razlicite rezolucije za razlicita rastojanja -- bliži objekti imaju visoku rezoluciju senki, dalji imaju nizu. Ovo je u sustini automatski Shadow LOD na nivou shadow map-e.

Medjutim, geometrija koja se renderuje u shadow pass i dalje koristi iste LOD nivoe kao main pass (ili LOD-ove podesene kroz Shadow LOD Bias). Cak i sa VSM-om, korist od agresivnijeg Shadow LOD-a postoji jer smanjuje vertex processing u shadow pass-u.

45.8.3 Shadow LOD strategija po tipu objekta

Tip objekta Shadow LOD preporuka
Veliko drvece Shadow LOD bias +1 do +2; disable shadows iznad 2000-3000m
Mali rekviziti Disable shadows iznad 500-1000m; ili potpuno disable static shadows
Zgrade Shadow LOD bias +1; senke su vazne za siluetu cak i daleko
Likovi (NPC) Shadow LOD bias +1; disable shadows za crowd NPC-ove na daljini
Teren Obicno baked senke; dynamic shadows samo za bliske cascade-ove
Vegetacija (trava) Disable shadows za male instance; samo veliki busevi/drvece bacaju senke

45.9 HLOD -- Hierarchical Level of Detail

45.9.1 Sta je HLOD?

Do sada smo govorili o LOD-u na nivou pojedinacnog mesh-a -- svaki objekat ima svoje LOD nivoe. Ali sta se desava kada imate grupu objekata koji su daleko od kamere?

Zamislite selo sa 200 kuca, od kojih je svaka zasebni mesh. Na 2 kilometra od kamere, svaka kuca zauzima mozda 5 piksela na ekranu. Cak i na LOD 3 sa 500 trouglova po kuci, to je 100.000 trouglova za objekte koji zajedno zauzimaju mozda 1.000 piksela. I sto je gore -- to je 200 zasebnih draw call-ova (ili u najboljem slucaju, 200 instanci ako su kuce identicne, sto obicno nisu).

HLOD (Hierarchical Level of Detail) resava ovaj problem tako sto spaja grupe udaljenih objekata u jedan pojednostavljeni mesh.

Bez HLOD-a (na velikom rastojanju):
    ┌──┐ ┌──┐ ┌──┐ ┌──┐ ┌──┐ ┌──┐      6 zasebnih objekata
    │K1│ │K2│ │K3│ │K4│ │K5│ │K6│      6 draw call-ova
    └──┘ └──┘ └──┘ └──┘ └──┘ └──┘      6 x LOD 3 = 3,000 trouglova

Sa HLOD-om (na velikom rastojanju):
    ┌──────────────────────────────┐    1 HLOD mesh
    │     Selo (merged + reduced) │    1 draw call
    └──────────────────────────────┘    500 trouglova ukupno

HLOD kombinuje dva benefita:

  1. Smanjenje geometrije -- merge-ovani mesh se moze agresivno simplifikovati jer je daleko od kamere
  2. Smanjenje draw call-ova -- umesto N draw call-ova za N objekata, imate 1 draw call za 1 HLOD mesh

45.9.2 Kako HLOD radi u UE5

UE5 ima dva HLOD sistema: Legacy HLOD (iz UE4) i World Partition HLOD (noviji sistem integrisan sa World Partition). Fokusiracemo se na oba, ali naglasak ce biti na World Partition HLOD-u jer je to moderni pristup.

Legacy HLOD (HLOD Volumes)

Legacy HLOD sistem koristi HLOD Volume-e -- specijalne volume-e koje stavljate u scenu i koje definisu grupe objekata za HLOD generaciju.

Workflow:

  1. Stavite HLOD Volume oko grupe objekata
  2. U World Settings, podesite HLOD parametre (broj nivoa, redukciju, merge distance)
  3. Pokrenite Build HLOD iz Build menija
  4. Engine generise merged i simplified mesheve za svaku HLOD grupu
  5. U runtime-u, kada je grupa dovoljno daleko, zamenjuje se HLOD mesh-om

Legacy HLOD ima nekoliko nivoa (obicno 2-4):

HLOD Level 0: Originalni objekti (blizu kamere)
HLOD Level 1: Grupe od 5-20 objekata merged u jedan mesh (srednje rastojanje)
HLOD Level 2: Grupe HLOD Level 1 mesheva merged u vece mesheve (daleko)
HLOD Level 3: Cela zona merged u jedan mesh (veoma daleko)

World Partition HLOD

World Partition HLOD (detalji u poglavlju 32) je noviji i robusniji sistem dizajniran za velike open-world projekte.

Kljucne razlike u odnosu na Legacy HLOD:

  1. Automatski -- Nema potrebe za rucnim postavljanjem HLOD Volume-a. World Partition automatski deli svet na celije (grid cells), i svaka celija automatski dobija HLOD reprezentaciju.

  2. Streaming-aware -- HLOD meshevi su potpuno integrisani sa World Partition streaming sistemom. Kada celija nije ucitana (jer je daleko), njen HLOD mesh se prikazuje umesto nje.

  3. Visestruki HLOD nivoi -- Mozete imati vise HLOD slojeva (HLOD Layers) sa razlicitim parametrima za razlicite tipove sadrzaja.

  4. Builder konfiguracioni -- Mozete birati razlicite HLOD buildere za razlicite slojeve:

    • Instancing Builder -- Zamenjuje grupu instanci pojednostavljenim instancama (dobar za vegetaciju)
    • Mesh Merge Builder -- Spaja sve mesheve u grupi u jedan (klasican pristup)
    • Mesh Simplify Builder -- Spaja i pojednostavljuje (najagresivnija redukcija)
    • Mesh Approximate Builder -- Generise proxy mesh koji aproksimira vizuelni izgled grupe (voxelizacija ili remeshing)
    • Custom Builder -- Mozete napraviti sopstveni HLOD builder
World Partition HLOD Workflow:

1. Svet je podeljen na grid celije (npr. 256m x 256m)

   ┌────┬────┬────┬────┐
   │ C1 │ C2 │ C3 │ C4 │
   ├────┼────┼────┼────┤
   │ C5 │ C6 │ C7 │ C8 │    Svaka celija sadrzi objekte
   ├────┼────┼────┼────┤
   │ C9 │C10 │C11 │C12 │
   ├────┼────┼────┼────┤
   │C13 │C14 │C15 │C16 │
   └────┴────┴────┴────┘

2. Build HLOD generise HLOD mesh za svaku celiju:

   ┌────┬────┬────┬────┐
   │ H1 │ H2 │ H3 │ H4 │    Svaka Hi je merged/simplified
   ├────┼────┼────┼────┤     verzija svih objekata u celiji Ci
   │ H5 │ H6 │ H7 │ H8 │
   ├────┼────┼────┼────┤
   │ H9 │H10 │H11 │H12 │
   ├────┼────┼────┼────┤
   │H13 │H14 │H15 │H16 │
   └────┴────┴────┴────┘

3. U runtime-u:
   - Celije blizu kamere: puni objekti ucitani, HLOD sakriven
   - Celije daleko od kamere: HLOD mesh prikazan umesto punih objekata
   - Celije van vidokruga: ni HLOD ni objekti nisu ucitani

45.9.3 HLOD Actors

Kada UE5 gradi HLOD, kreira specijalne HLOD Actor-e za svaku grupu. Ovi actor-i sadrze:

HLOD Actor-i se cuvaju kao zasebni asset-i u projektu (obicno u __ExternalActors__ folderu za World Partition projekte).

45.9.4 HLOD i Nanite

Interesantno pitanje: da li HLOD ima smisla kada koristite Nanite?

Odgovor je: da, i dalje ima smisla, ali iz drugacijih razloga.

Nanite resava problem geometrijske kompleksnosti -- automatski prilagodjava nivo detalja. Ali Nanite ne resava problem broja objekata u memoriji. Hiljada objekata na daljini, svaki sa Nanite podatkovnim strukturama, i dalje zauzima memoriju i zahteva CPU rad za instancne podatke, transformacije, culling.

HLOD sa Nanite-om radi sledece:

Dakle, cak i u Nanite svetu, HLOD sluzi za konsolidaciju objekata na daljini, ne za geometrijsku redukciju (tu Nanite vec obavlja posao).

45.9.5 Best practices za HLOD

  1. Pravilna velicina celija. Premale celije generisu previse HLOD mesheva (gubi se draw call benefit). Prevelike celije generisu ogromne HLOD mesheve koji su skupi za streaming i imaju los culling. Tipicna velicina celija za World Partition HLOD je 128m-512m, zavisno od gustine scene.

  2. Teksturni atlasi. Kada se vise materijala merge-uje u HLOD, UE5 bake-uje teksture u atlas. Kontrolisite rezoluciju atlasa -- prevelika rezolucija trosi memoriju, premala gubi detalj. Za daleke HLOD-ove, 512x512 ili 1024x1024 je cesto dovoljno.

  3. Ekskluzija objekata. Ne moraju svi objekti biti deo HLOD-a. Objekti koji su vec dovoljno jednostavni (billboard-i, low-poly vegetacija) mogu biti iskljuceni iz HLOD generacije.

  4. Rebuild HLOD redovno. Kada menjate scene, HLOD meshevi postaju zastareli. Redovno rebuild-ujte HLOD-ove da bi reflektovali trenutno stanje scene.

  5. Vise HLOD slojeva za razlicite tipove sadrzaja. Zgrade mogu koristiti Mesh Merge builder, vegetacija moze koristiti Instancing builder, a veliki staticni objekti mogu koristiti Mesh Simplify builder. Svaki tip sadrzaja ima razlicite optimalne strategije.


45.10 Performansni uticaj LOD-a

45.10.1 Koliko LOD zaista stedeli?

Ovo je pitanje koje svaki developer treba da postavi: koliko performansi zapravo dobijam od LOD sistema? Odgovor zavisi od tipa scene, ali pogledajmo tipicne brojke.

Primer: Open-World scena bez LOD-a vs sa LOD-om

Scena: Seosko okruzenje, 5km x 5km
Objekti: 15,000 Static Meshes (kuce, drvece, stene, ograde, rekviziti)

BEZ LOD-a (svi objekti na LOD 0):
─────────────────────────────────
Ukupno trouglova u sceni:     ~800,000,000  (800M)
Trouglova posle frustum culling: ~120,000,000  (120M)
Trouglova posle occlusion culling: ~60,000,000   (60M)
Draw calls:                    ~8,000
Frame time (GPU):              ~45ms
Frame time (CPU/rendering):    ~28ms
FPS:                           ~22 FPS

SA LOD-om (4 LOD nivoa po mesh-u):
──────────────────────────────────
Ukupno trouglova u sceni:     ~800,000,000  (isti)
Trouglova posle frustum culling: ~120,000,000  (isti)
Trouglova posle occlusion culling: ~15,000,000   (15M!)  <-- LOD drasticno smanjuje
Draw calls:                    ~8,000  (isti bez HLOD-a)
Frame time (GPU):              ~12ms
Frame time (CPU/rendering):    ~28ms   (isti - LOD ne utice na draw call count)
FPS:                           ~35 FPS (poboljsanje od ~60%)

SA LOD-om + HLOD-om:
────────────────────
Trouglova posle culling + LOD + HLOD: ~8,000,000  (8M)
Draw calls:                          ~2,500  (HLOD smanjuje!)
Frame time (GPU):                    ~8ms
Frame time (CPU/rendering):          ~12ms
FPS:                                 ~60+ FPS

SA Nanite (umesto tradicionalnog LOD-a):
────────────────────────────────────────
Trouglova renderovanih:              ~6,000,000  (priblizno = broj piksela)
Draw calls:                          ~200  (Nanite GPU-driven)
Frame time (GPU):                    ~6ms
Frame time (CPU/rendering):          ~4ms
FPS:                                 ~60+ FPS (sa headroom-om)

Napomena: ovi brojevi su ilustrativni i zavise od mnogo faktora (hardware, rezolucija, kompleksnost materijala, itd.), ali proporcije su realisticne.

45.10.2 Gde LOD stedeli -- i gde ne stedeli

LOD STEDELI na:

Resurs Kako LOD pomaze Tipicna usteda
Vertex Processing Manje trouglova = manje posla za vertex shader 60-90% na daljini
Rasterization Manje trouglova = manje rasterizacionog posla 60-90% na daljini
Shadow Pass Shadow LOD koristi jos jednostavniji mesh 50-80%
Memory (sa HLOD) HLOD zamenjuje mnoge mesheve jednim 30-60% za daleke zone
Draw Calls (sa HLOD) HLOD konsoliduje objekte 50-80% za daleke zone

LOD NE STEDELI (ili malo stedeli) na:

Resurs Zasto LOD ne pomaze mnogo
Pixel Shader LOD ne menja materijal (osim Material LOD). Isti materijal se i dalje izvrsava za svaki vidljivi piksel
Texture Memory LOD ne menja teksture. Ista 4K tekstura je ucitana bez obzira na LOD nivo (Virtual Texturing moze pomoci ovde -- poglavlje 34)
CPU Tick LOD ne utice na Blueprint/C++ logiku. Actor i dalje "zivi" u igri
Physics LOD ne menja fizicku koliziju. Objekat i dalje ima istu koliziju
Audio LOD ne utice na zvuk. Zvucni izvori i dalje emituju

Ovo je vazna lekcija: LOD je primarno alat za ustedu geometrijskog processinga. Za ostale aspekte performansi, potrebni su drugi sistemi (streaming za memoriju, scalability za materijale, distance-based culling za CPU, itd.).

45.10.3 Overhead samog LOD sistema

LOD sistem sam po sebi ima odredjen overhead:

  1. LOD selekcija -- Za svaki vidljivi mesh, engine mora da izracuna screen size i odluci koji LOD da koristi. Ovo je relativno jeftino (par instrukcija po mesh-u), ali sa hiljadama mesheva moze da se odrazi na CPU.

  2. Memorija za LOD-ove -- Svaki LOD nivo zauzima memoriju za vertex i index buffer-e. Mesh sa 4 LOD-a zauzima vise memorije od mesh-a sa 1 LOD-om (ali ne 4x vise, jer nizi LOD-ovi su mnogo manji).

  3. Streaming overhead -- Ako koristite LOD streaming (ucitavanje LOD-ova po potrebi umesto drzanja svih u memoriji), postoji overhead za streaming logiku.

Tipicna memorijska cena LOD-ova:

Mesh sa 50,000 trouglova, 4 LOD nivoa:

LOD 0: 50,000 tri  ~  3.0 MB  (vertex + index buffers)
LOD 1: 15,000 tri  ~  0.9 MB
LOD 2:  5,000 tri  ~  0.3 MB
LOD 3:  1,000 tri  ~  0.06 MB
                      --------
Ukupno:               ~4.26 MB  (umesto 3.0 MB bez LOD-a)

Overhead: ~42% vise memorije za geometriju,
ali ~75% manje rendering cost-a na daljini.

U vecini slucajeva, memorijski overhead LOD-ova je odlicna investicija. Placate 42% vise memorije za geometriju, ali dobijate masivnu ustedu u rendering cost-u.


45.11 LOD za specificne tipove objekata

45.11.1 Foliage LOD (Vegetacija)

Vegetacija je jedan od najzahtevnijih tipova sadrzaja za LOD sisteme. Drvece, busevlje, trava -- sve to ima ogroman broj instanci i kompleksnu geometriju.

Drvece -- tipican LOD pristup:

LOD 0: Full 3D krošnja + stablo      25,000 tri    < 50m
LOD 1: Pojednostavljena krošnja       8,000 tri    50-150m
LOD 2: Nekoliko cross-planova         2,000 tri    150-500m
LOD 3: Billboard (2 trougla)              2 tri    500m+

Billboard LOD za drvece je posebna tehnika gde se 3D drvo zamenjuje 2D slikom (sprite) na najvisem LOD nivou. UE5 ima ugradjen Billboard Component za ovo. Problem sa billboard-ima je sto su ocigledni pri rotaciji kamere (2D slika se ne menja pravilno sa uglom gledanja), pa se cesto koriste imposteri -- set slika iz vise uglova (obicno 8-16 uglova) koji se biraju na osnovu ugla kamere.

Trava obicno koristi samo 1-2 LOD nivoa i agresivan distance culling:

LOD 0: 3-4 trougla po vlati    < 30m
LOD 1: 2 trougla (cross-plan)  30-60m
Cull:  Ne prikazuje se          > 60m

Foliage sistem u UE5 koristi HISM (Hierarchical Instanced Static Mesh) za instanciranje, sto daje automatski per-instance LOD selekciju i hijerarhijski culling (poglavlje 42).

45.11.2 Skeletal Mesh LOD (Likovi)

Skeletal Mesh LOD je slozeniji od Static Mesh LOD-a jer osim geometrije, morate upravljati i sa:

UE5 Skeletal Mesh LOD primer (humanoid):

LOD 0 (< 15m):
  - 65,000 trouglova
  - 120 kostiju
  - Cloth simulation ON
  - Morph targets ON
  - Animation tick: svaki frejm
  - Shadow: puni mesh

LOD 1 (15-50m):
  - 25,000 trouglova
  - 60 kostiju
  - Cloth simulation OFF
  - Morph targets OFF
  - Animation tick: svaki frejm
  - Shadow: LOD 1

LOD 2 (50-150m):
  - 8,000 trouglova
  - 30 kostiju
  - Animation tick: svaki drugi frejm
  - Shadow: LOD 2 ili disabled

LOD 3 (150m+):
  - 2,000 trouglova
  - 15 kostiju
  - Animation tick: svaki cetvrti frejm
  - Shadow: disabled

45.11.3 Landscape/Terrain LOD

Teren ima sopstveni LOD sistem koji se razlikuje od Mesh LOD-a. UE5 Landscape koristi quadtree-based LOD gde se teren deli na sve manje blokove (components > sections > quads), i svaki blok ima svoj LOD nivo.

Landscape LOD hijerarhija:

    ┌────────────────────────────────┐
    │            LOD 4              │   Najdalje -- ceo komponent je
    │   (jedan blok, minimalni      │   renderovan sa minimalnim detaljima
    │    detalji)                   │
    └────────────────────────────────┘
              |
    ┌────────┬────────┐
    │ LOD 3  │ LOD 3  │              Daleko -- 4 bloka,
    ├────────┼────────┤              srednji detalji
    │ LOD 3  │ LOD 3  │
    └────────┴────────┘
              |
    ┌───┬───┬───┬───┐
    │ 2 │ 2 │ 2 │ 2 │               Srednje -- 16 blokova,
    ├───┼───┼───┼───┤               vise detalja
    │ 2 │ 2 │ 2 │ 2 │
    ├───┼───┼───┼───┤
    │ 2 │ 2 │ 2 │ 2 │
    ├───┼───┼───┼───┤
    │ 2 │ 2 │ 2 │ 2 │
    └───┴───┴───┴───┘

Landscape LOD se kontrolise parametrima:

Od UE 5.2, Nanite moze da se koristi za Landscape, sto eliminise potrebu za ovim manuelnim LOD sistemom na podrzanim platformama.


45.12 LOD u produkcijskom pipeline-u

45.12.1 Kada generisati LOD-ove?

Pitanje "kada u pipeline-u praviti LOD-ove" je vazno za efikasan rad tima.

Opcija 1: LOD-ovi na kraju produkcije

Prednost: Umetnici rade slobodno na punom detalju, LOD-ovi se generisu automatski pred kraj projekta. Mana: Ako automatski LOD-ovi ne izgledaju dobro, nema vremena za rucne popravke.

Opcija 2: LOD-ovi tokom produkcije (inkrementalno)

Prednost: Mozete testirati performanse u toku razvoja. Rucni LOD-ovi se mogu praviti paralelno sa finalnim mesh-om. Mana: LOD-ovi moraju da se azuriraju svaki put kada se mesh promeni.

Opcija 3: Automatski LOD pipeline sa validacijom (preporuceno)

Ovo je hibridni pristup koji koriste vecina profesionalnih studija:

  1. Umetnik pravi mesh u punoj rezoluciji
  2. Import pipeline automatski generise LOD-ove (poglavlje 37)
  3. Alat za validaciju proverava da automatski LOD-ovi ispunjavaju kvalitetne kriterijume (max screen size error, minimalan triangle count po LOD-u, ocuvana silueta)
  4. Samo meshevi koji padnu validaciju se salju na rucnu doradu LOD-ova
  5. HLOD se Build-uje periodicno (npr. jednom dnevno na build masini)

45.12.2 LOD Validation -- Kako proveriti kvalitet LOD-a

UE5 ima ugradjen LOD Preview u Static Mesh editoru gde mozete:

  1. Prebacivati se izmedju LOD-ova -- dugmadi LOD 0, LOD 1, LOD 2... u toolbar-u
  2. Videti statistike -- broj trouglova, verteksa, UV kanala za svaki LOD
  3. Uporediti screen size -- videti na kom screen size-u se svaki LOD aktivira
  4. Prikazati LOD coloring u viewportu -- svaki LOD je obojen drugom bojom, tako da u sceni mozete videti koji LOD se koristi za koji objekat

Vizuelizacioni mod u viewportu:

View Mode > Level of Detail Coloring

LOD 0: Beli
LOD 1: Zeleni
LOD 2: Zuti
LOD 3: Narandzasti
LOD 4: Crveni
HLOD:  Plavi

Ovo je izuzetno korisno za debug -- mozete na prvi pogled videti da li se LOD-ovi aktiviraju na odgovarajucim rastojanjima, i da li postoje objekti koji ne koriste LOD uopste (beli na velikim rastojanjima = potencijalni problem).

45.12.3 Automatizacija LOD generacije u pipeline-u

Za vece projekte, LOD generacija se obicno automatizuje koristeci:

  1. Editor Utility Widgets/Blueprints -- UE5 scripting za batch procesiranje mesh-eva i generisanje LOD-ova sa konzistentnim parametrima.

  2. Python Editor Scripting -- UE5 Python API za automatizovanu LOD generaciju:

# Pseudo-kod za batch LOD generaciju u UE5 Python
import unreal

asset_registry = unreal.AssetRegistryHelpers.get_asset_registry()
static_meshes = asset_registry.get_assets_by_class("StaticMesh")

for mesh_data in static_meshes:
    mesh = unreal.EditorAssetLibrary.load_asset(mesh_data.object_path)
    
    # Automatski generisi LOD-ove ako ih nema
    if mesh.get_num_lods() == 1:
        lod_settings = unreal.EditorStaticMeshLibrary.set_lod_count(mesh, 4)
        
        # Podesi redukciju za svaki LOD
        # LOD 1: 50% trouglova
        # LOD 2: 25% trouglova
        # LOD 3: 10% trouglova
        for lod_index in range(1, 4):
            reduction = [0.5, 0.25, 0.1][lod_index - 1]
            # ... podesi reduction settings ...
  1. CI/CD integracija -- LOD generacija kao korak u build pipeline-u. Svaki commit koji dodaje novi mesh automatski triggeruje LOD generaciju na build serveru. Detalje o asset pipeline automatizaciji pogledajte u poglavlju 37.

45.13 Napredne LOD tehnike

45.13.1 Imposter LOD

Imposter je tehnika gde se 3D objekat na najvisem LOD nivou zamenjuje 2D reprezentacijom -- ali ne prostim billboard-om, vec setom pre-renderovanih slika iz razlicitih uglova.

Imposter generacija:

1. Renderujte objekat iz N uglova (npr. 16 horizontalnih x 8 vertikalnih = 128 slika)
2. Za svaku sliku sacuvajte: Base Color, Normal, Depth
3. U runtime-u, na osnovu ugla kamere, birajte najblizu sliku (ili interpolirajte izmedju dve)

     ┌─────────────────────────────────┐
     │  0°   22.5°  45°  67.5°  90°   │
     │  ┌──┐  ┌──┐  ┌──┐  ┌──┐  ┌──┐ │
     │  │  │  │  │  │  │  │  │  │  │  │   16 uglova horizontalno
     │  └──┘  └──┘  └──┘  └──┘  └──┘  │
     │  ...   ...   ...   ...   ...   │
     └─────────────────────────────────┘

UE5 nema ugradjen imposter sistem, ali postoji nekoliko plugin-ova i marketplace alata koji ga implementiraju. Za projekte sa ogromnim brojem instanci (sume sa milionima stabala), imposteri mogu biti kljucna optimizacija.

45.13.2 Proxy Mesh LOD (Mesh Approximation)

Proxy mesh je tehnika gde se geometrija objekta (ili grupe objekata) zamenjuje pojednostavljenim mesh-om koji aproksimira originalni oblik, ali sa potpuno novom topologijom.

Za razliku od mesh simplification-a (koji samo uklanja trouglove iz originalnog mesh-a), proxy mesh generacija kreira nov mesh od nule koji ima glatku, uniformnu topologiju. Ovo je posebno korisno za HLOD gde se vise objekata sa potpuno razlicitim topologijama spaja u jedan.

UE5 koristi proxy mesh generaciju (Mesh Approximate Builder) u svom HLOD sistemu. Proces tipicno ukljucuje:

  1. Voxelizacija -- Originalni objekti se pretvaraju u voxel grid
  2. Surface extraction -- Iz voxel grid-a se izvlaci nova povrsina (Marching Cubes ili slican algoritam)
  3. Remeshing -- Nova povrsina se remesh-uje u uniformnu, clean topologiju
  4. UV unwrap -- Automatski UV unwrap za teksturu
  5. Texture baking -- Originalne teksture se bake-uju na novi mesh

45.13.3 Screen-Size Based Component Activation

Osim geometrijskog LOD-a, mozete implementirati LOD na nivou citavih komponenti. Na primer:

// Pseudo-kod: Aktivirajte/deaktivirajte komponente na osnovu rastojanja

void AMyActor::Tick(float DeltaTime)
{
    float DistToCamera = GetDistanceToCamera();
    
    // Blizu: sve komponente aktivne
    if (DistToCamera < 50.0f)
    {
        ParticleComponent->SetActive(true);
        PointLightComponent->SetVisibility(true);
        AudioComponent->SetVolumeMultiplier(1.0f);
        PhysicsSimulation->SetEnabled(true);
    }
    // Srednje: iskljuci cestice i svetlo
    else if (DistToCamera < 200.0f)
    {
        ParticleComponent->SetActive(false);
        PointLightComponent->SetVisibility(false);
        AudioComponent->SetVolumeMultiplier(0.5f);
        PhysicsSimulation->SetEnabled(true);
    }
    // Daleko: iskljuci sve osim osnovnog renderovanja
    else
    {
        ParticleComponent->SetActive(false);
        PointLightComponent->SetVisibility(false);
        AudioComponent->SetVolumeMultiplier(0.0f);
        PhysicsSimulation->SetEnabled(false);
    }
}

Ova tehnika nije deo Mesh LOD sistema, ali je vazan deo sire LOD filozofije -- "prilagodi kompleksnost rastojanju" na svakom nivou.

UE5 ima ugradjen Significance Manager koji automatizuje ovakvu logiku. Dodeljujete "vaznost" svakom actor-u na osnovu rastojanja i drugih faktora, i engine automatski smanjuje update frekvenciju, iskljucuje efekte, i slicno za manje vazne actore.


45.14 Prakticni saveti i ceste greske

45.14.1 Ceste greske pri radu sa LOD-om

Greska 1: Nikakav LOD

Ovo je najcesca greska, pogotovo na pocetku projekta. Developeri importuju mesheve bez LOD-ova, scena izgleda dobro u editoru (jer je kamera obicno blizu), a onda se iznenade kada open-world scena ima 15 FPS. Resenje: uvek generisajte LOD-ove, makar automatski. Cak i automatski LOD-ovi sa default parametrima su mnogo bolji od nikakvih.

Greska 2: Preostra redukcija na LOD 1

LOD 0 ima 100.000 trouglova, LOD 1 ima 3.000. Tranzicija je brutalno vidljiva. Resenje: postepena redukcija. LOD 1 bi trebao biti 30-50% od LOD 0, ne 3%.

Greska 3: Previse LOD nivoa za male objekte

Kutija sa 200 trouglova ne treba 5 LOD nivoa. LOD sistem ima overhead (memorija, LOD selekcija), i za jednostavne mesheve taj overhead moze nadmasiti ustedu. Resenje: za mesheve ispod 1.000 trouglova, 1-2 LOD-a su dovoljni. Za mesheve ispod 100 trouglova, LOD je cesto nepotreban.

Greska 4: Ignorisanje LOD-a za senke

Mesh koristi LOD 2 za rendering, ali senke i dalje koriste LOD 0. Shadow pass renderuje 5x vise trouglova nego sto treba. Resenje: uvek podesite Shadow LOD Bias ili disable-ujte senke na daljini.

Greska 5: Nedosledne screen size vrednosti

Razliciti meshevi imaju radikalno razlicite screen size pragove za LOD tranzicije, bez jasnog razloga. Jedan mesh prelazi na LOD 1 pri 0.75 screen size, drugi pri 0.1. Resenje: standardizujte screen size pragove koristeci LOD Grupe. Ceo projekat treba da ima konzistentne LOD standarde.

Greska 6: Ne testiranje LOD-ova sa gameplay kamerom

LOD-ovi koji izgledaju dobro u editoru (gde mozete slobodno leteti) mogu izgledati lose sa gameplay kamerom (trecelice, FPS). Razlicit FOV, razlicito kretanje kamere -- sve to utice na percepciju LOD tranzicija. Resenje: uvek testirajte LOD-ove iz perspektive gameplay kamere, ne editorske.

Greska 7: Koriscenje LOD-a kao zamene za dobar base mesh

LOD ne popravlja los originalni mesh. Ako vas LOD 0 ima 500.000 trouglova za objekat koji nikada ne treba vise od 50.000, LOD 1 od 150.000 je i dalje preskup. Resenje: pocnite sa razumnim LOD 0 -- mesh koji ima onoliko detalja koliko je zapravo potrebno za najblize rastojanje.

45.14.2 Checklista za LOD setup u projektu

  1. Da li svaki non-Nanite Static Mesh ima bar 2 LOD nivoa?
  2. Da li su LOD redukcije postepene (ne vise od 50-60% redukcije po nivou)?
  3. Da li Skeletal Meshevi imaju LOD-ove sa smanjenim bone count-om?
  4. Da li su Shadow LOD Bias-i podesnei za daleke objekte?
  5. Da li postoji LOD Coloring vizuelizacija u projektu za debugging?
  6. Da li je foliage konfigurisana sa odgovarajucim LOD-ovima i cull distance-om?
  7. Da li je HLOD Build aktuelan i reflektuje trenutno stanje scene?
  8. Da li su LOD screen size pragovi konzistentni kroz projekat (LOD Grupe)?
  9. Da li su Material LOD-ovi implementirani za kompleksne materijale?
  10. Da li Nanite meshevi imaju ispravan Nanite fallback za platforme koje ne podrzavaju Nanite?

45.15 Nanite Fallback LOD

45.15.1 Sta je Nanite Fallback?

Jedno vazno pitanje: sta se desava sa Nanite meshem na platformi koja ne podrzava Nanite? Ili sta ako korisnik iskljuci Nanite u settings-ima?

UE5 automatski generise Nanite Fallback Mesh -- tradicionalni mesh sa LOD-ovima koji se koristi umesto Nanite sistema kada Nanite nije dostupan.

Nanite Mesh:
├── Nanite Data (klaster hijerarhija)    -- koristi se na podrzanim platformama
└── Fallback Mesh                        -- koristi se na ne-podrzanim platformama
    ├── LOD 0 (automatski generisan)
    ├── LOD 1
    ├── LOD 2
    └── LOD 3

45.15.2 Kontrola Fallback mesh-a

U Static Mesh editoru, pod Nanite Settings, mozete kontrolisati fallback mesh:

Nanite Fallback LOD je posebno vazan za:


45.16 Buduccnost LOD sistema

45.16.1 Trendovi

LOD sistemi se neprekidno razvijaju. Evo nekoliko trendova koji oblikuju buducnost:

1. GPU-Driven LOD postaje standard. Nanite je pokazao da GPU moze efikasnije nego CPU da odlucuje o LOD selekciji. Ocekujte da sve vise engine-a (ne samo UE5) implementira slicne sisteme.

2. Machine Learning za LOD generaciju. Umesto rucnih algoritama za mesh simplifikaciju, ML modeli mogu nauciti sta je "vazno" na mesh-u i pametnije birati sta da sacuvaju a sta da uklone.

3. Neural LOD. Umesto simplifikovanog mesh-a, daleki objekti bi mogli biti renderovani koristeci neural radiance fields (NeRF) ili slicne tehnike -- potpuno drugacija reprezentacija umesto poligonalne.

4. Streaming + LOD konvergencija. Granica izmedju "streaming" (ucitavanje podataka po potrebi) i "LOD" (prikazivanje manje detalja) sve vise nestaje. Nanite vec spaja oba koncepta -- streaming klastera je LOD, i obrnuto.

5. Nanite za sve tipove geometrije. Trenutno Nanite ne podrzava skeletal mesheve, ali Epic aktivno radi na tome. Kada Nanite bude radio sa animiranom geometrijom, tradicionalni skeletal mesh LOD postace relikvija proslosti, isto kao sto je Nanite vec ucinio za statickne mesheve.


Rezime poglavlja

Level of Detail je jedan od najstarijih i najvaznijih koncepata u real-time renderovanju. Hajde da sumiramo kljucne tacke:

  1. LOD smanjuje rendering cost prikazivanjem jednostavnijih verzija objekata na vecim rastojanjima. Ovo je fundamentalna optimizacija bez koje moderni open-world projekti ne bi bili mogui.

  2. Diskretni Mesh LOD koristi fiksni set mesh verzija (LOD 0, 1, 2, 3...) i prebacuje se izmedju njih na osnovu screen size-a. Ovo je standardni pristup u UE5 za non-Nanite mesheve.

  3. Automatska LOD generacija u UE5 koristi QEM-bazirane mesh simplification algoritme i odlicna je za vecinu slucajeva. Rucni LOD-ovi su potrebni samo za kriticne objekte gde automatski rezultati nisu dovoljno dobri.

  4. LOD tranzicioni artefakti (popping) se minimiziraju koristeci dithered transitions (per-pixel noise blending) koje UE5 podrzava iz kutije. Cross-fade je glatkiji ali skuplji pristup.

  5. CLOD (Continuous LOD) je elegantna ideja (progressive meshes) koja u praksi ima prevelik runtime overhead za sirok upotrebu -- ali je inspirisao Nanite.

  6. Nanite je ultimativni LOD sistem za podrzane mesheve -- automatski, per-cluster, bez vidljivih tranzicija, bez rucnog rada. Za opaque static mesheve, Nanite potpuno zamenjuje tradicionalne LOD-ove.

  7. Material LOD pojednostavljuje materijale na daljini -- uklanja POM, detail texture, kompleksne blend-ove. Ovo je cesto zanemarena optimizacija koja moze znacajno smanjiti pixel shader cost.

  8. Shadow LOD koristi agresivnije LOD-ove za shadow pass i iskljucuje senke na daljini. Ovo smanjuje i vertex i rasterization cost shadow pass-a.

  9. HLOD (Hierarchical LOD) spaja grupe daleki objekata u jedan mesh, smanjujuci i geometriju i draw call-ove. World Partition HLOD automatizuje ovaj proces za open-world projekte.

  10. LOD nije srebrni metak -- ne resava pixel shader cost, texture memory, CPU tick, ili physics. Za te aspekte su potrebni drugi sistemi.

  11. Uvek profajlirajte. LOD Coloring vizuelizacija, stat RHI, i profajleri (poglavlja 40 i 41) su vasi alati za proveru da li LOD sistem radi kako treba.


Kljucni pojmovi

Termin Objasnjenje
LOD (Level of Detail) Sistem koji prikazuje objekte sa razlicitim nivoima geometrijskog detalja zavisno od rastojanja od kamere
Discrete LOD LOD sa fiksnim brojem unapred pripremljenih mesh verzija; engine bira jednu po frejmu
CLOD (Continuous LOD) Koncept kontinualne promene geometrije bez diskretnih skokova; Progressive Meshes
Screen Size Procenat ekrana koji bounding sphere mesh-a zauzima; osnova za LOD selekciju u UE5
LOD Bias Offset koji pomera LOD selekciju ka agresivnijim (visi bias) ili konzervativnijim (nizi bias) LOD nivoima
Popping Vizuelni artefakt gde se mesh naglo menja prilikom LOD tranzicije
Dithered Transition Tehnika LOD tranzicije koja koristi noise pattern za postepeno blendovanje dva LOD nivoa
Cross-Fade Tehnika LOD tranzicije koja renderuje oba LOD-a i koristi alpha blending za glatku promenu
Mesh Simplification Proces automatskog smanjivanja broja trouglova u mesh-u, obicno putem edge collapse operacija
QEM (Quadric Error Metric) Algoritam za mesh simplifikaciju koji minimizuje geometrijsku gresku pri edge collapse operacijama
HLOD (Hierarchical LOD) Sistem koji spaja grupe udaljenih objekata u jedan pojednostavljeni mesh, smanjujuci i geometriju i draw call-ove
HLOD Actor UE5 actor koji sadrzi merged mesh reprezentaciju grupe objekata za prikaz na daljini
World Partition HLOD HLOD sistem integrisan sa UE5 World Partition, automatski generise HLOD po grid celijama
Material LOD Pojednostavljivanje materijala na vecim rastojanjima (uklanjanje POM, detail texture, itd.)
Shadow LOD Koriscenje nozih LOD nivoa za shadow pass rendering i iskljucivanje senki na daljini
Billboard / Imposter 2D reprezentacija 3D objekta na najvisem LOD nivou; imposter koristi vise uglova pogleda
Proxy Mesh Pojednostavljen mesh sa novom topologijom koji aproksimira vizuelni izgled grupe objekata
LOD Group Predefinisan profil LOD parametara u UE5 za razlicite tipove mesh-eva (Small, Medium, Large, itd.)
Nanite Fallback Tradicionalni mesh sa LOD-ovima koji se koristi umesto Nanite podataka na platformama koje ne podrzavaju Nanite
Forced LOD Fiksiranje mesh-a na konkretan LOD nivo, bez obzira na screen size (obicno za debug)
Bone LOD Smanjivanje broja kostiju u skeleton-u na visim LOD nivoima skeletal mesh-a
LOD Coloring Vizuelizacioni mod u UE5 viewportu koji boji objekte razlicitim bojama zavisno od aktivnog LOD nivoa
Significance Manager UE5 sistem koji automatski smanjuje update frekvenciju i kompleksnost za manje vazne (udaljenije) actore

Veze sa drugim poglavljima


Preporuceno citanje i resursi

  1. Epic Games dokumentacija: Static Mesh LOD -- Zvanicno uputstvo za automatsku LOD generaciju u UE5

  2. Epic Games dokumentacija: HLOD -- Zvanicno uputstvo za HLOD sistem ukljucujuci World Partition HLOD

  3. "Progressive Meshes" (Hugues Hoppe, SIGGRAPH 1996) -- Fundamentalni rad o Continuous LOD i progressive mesh konceptu

  4. "Surface Simplification Using Quadric Error Metrics" (Garland & Heckbert, SIGGRAPH 1997) -- Rad koji opisuje QEM algoritam koriscen u vecini mesh simplification implementacija, ukljucujuci UE5

  5. "Real-Time Rendering, 4th Edition" (Akenine-Moller et al.) -- Poglavlje 19 detaljno pokriva LOD sisteme, HLOD, i tranzicione tehnike

  6. "A Deep Dive into Nanite Virtualized Geometry" (Brian Karis, SIGGRAPH 2021) -- Tehnicko objasnjenje kako Nanite implementira per-cluster LOD i eliminise tradicionalne LOD artefakte

  7. GDC Talk: "Large Worlds in UE5: A Whole New (Open) World" (Epic Games) -- Prakticno objasnjenje World Partition HLOD sistema u produkcijskim projektima

  8. "Level of Detail for 3D Graphics" (Luebke et al., Morgan Kaufmann 2003) -- Knjiga u potpunosti posvecena LOD tehnikama -- od diskretnog LOD-a, preko CLOD-a, do perceptualno vodenih LOD sistema