Poglavlje 19: Teksturne tehnike u materijalima
"Geometrija ti daje oblik. Teksture ti daju dusu. Ali prave teksturne tehnike -- one ti daju iluziju koja vara i najiskusnije oko."
Dosli smo do poglavlja koje ce, bez preterivanja, potpuno promeniti nacin na koji razmisljas o povrsinama u Unreal Engine 5. Do sada smo naucili sta su teksture (Poglavlje 05), kako UV koordinate rade (Poglavlje 04), sta su normale i zasto su bitne (Poglavlje 03), i kako PBR materijali koriste sve te informacije da stvore uverljiv izgled (Poglavlje 11). Sada cemo zaroniti duboko u konkretne tehnike koje profesionalni environment artisti i technical artisti koriste svaki dan.
Ovo poglavlje pokriva sedam velikih tema:
- Normal Mapping -- lazna geometrija koju svako koristi
- Parallax Mapping -- dubina bez poligona
- Displacement Mapping -- prava geometrija iz teksture
- Detail Textures -- resenje za blizinu kamere
- Texture Blending -- kako spojiti razlicite materijale
- Triplanar Mapping -- teksturiranje bez UV-a
- Decals -- projektovanje materijala na povrsine
Svaka od ovih tehnika resava specificnu vrstu problema, i profesionalni projekti ih kombinuju sve zajedno. Krenimo.
19.1 Normal Mapping
19.1.1 Sta je Normal Map i zasto postoji
Zamisli da pravis zid od cigle. Ako bi svaku ciglu, svaki deo maltera, svaku pukotinu modelovao kao pravu geometriju, imao bi mesh sa milionima poligona -- za jedan obican zid. To je ocito neodrzivo u real-time renderingu.
Normal map resava ovaj problem tako sto laze osvetljenju. Umesto da menja geometriju, normal map menja pravac normale na svakoj tacki povrsine. Posto osvetljenje zavisi od pravca normale (kao sto smo detaljno objasnili u Poglavlju 03), promena normale menja i to kako se svetlost odbija -- i odjednom ravna povrsina izgleda kao da ima udubljenja i izbocine.
Normal map je RGB tekstura gde:
- R (crveni kanal) kodira X komponentu normale
- G (zeleni kanal) kodira Y komponentu normale
- B (plavi kanal) kodira Z komponentu normale
Vrednosti su mapirane iz opsega [-1, 1] u [0, 255] (za 8-bitnu teksturu), pa neutrana normala (0, 0, 1) -- koja znaci "pravo nagore od povrsine" -- postaje (128, 128, 255), sto je ona prepoznatljiva ljubicasto-plava boja koju vidis kad otvoris normal map.
19.1.2 Tangent Space vs World Space Normals
Postoje dva fundamentalno razlicita pristupa kodiranju normala u mapi:
Tangent Space Normal Maps
Ovo je daleko najcesci tip i onaj koji ces koristiti u 99% slucajeva u UE5.
Tangent space normal map kodira normale relativno u odnosu na povrsinu mesha. To znaci da je svaka normala izrazena u lokalnom koordinatnom sistemu koji se sastoji od tri vektora:
- T (Tangent) -- pravac duz U koordinate UV mape
- B (Bitangent, ponekad nazivan Binormal) -- pravac duz V koordinate UV mape
- N (Normal) -- normala povrsine
Ova tri vektora formiraju TBN matricu (o kojoj cemo detaljnije za minut).
Prednosti tangent space normal mapa:
- Mogu se ponovo koristiti na razlicitim meshevima
- Rade sa deformacijama (animacije, morph targets)
- Mogu se tileable -- ista normal map moze da se ponavlja
- Mogu se rotirati na povrsini bez problema
Zato su tangent space normal mape standardni tip koji UE5 ocekuje na svom Normal ulazu materijala.
World Space Normal Maps
World space normal map kodira normale u globalnom koordinatnom sistemu scene. Plavi kanal uvek znaci "nagore u svetu", crveni "desno u svetu", zeleni "napred u svetu".
Kada otvoris world space normal map, videces raznolike boje -- crvene, zelene, plave, zute -- jer razliciti delovi povrsine gledaju u razlicitim pravcima u globalnom prostoru.
Prednosti world space normal mapa:
- Nema seam artefakata -- nema problema na spojevima UV ostrvaca
- Nema problema sa mirrored UV -- svaki piksel ima apsolutnu vrednost
- Jednostavnije za blendovanje -- mozes linearno interpolirati dve world space normal mape
Mane:
- Ne mogu se ponovo koristiti na drugom meshu
- Ne rade sa animacijom -- kad se mesh pomeri, normale ostaju "zaglavljene"
- Ne mogu se tile-ovati
- Moraju se ponovo bake-ovati za svaku promenu mesha
U praksi u UE5, world space normal mape se koriste uglavnom za teren i za specificne efekte gde su tangent space mape problematicne. Za vecinu asset-a, koristices tangent space.
19.1.3 TBN matrica -- kako zapravo radi
Ovo je deo koji mnogi preskace, ali razumevanje TBN matrice ti daje moc da debugujes probleme sa normal mapama koje bi inace bile misteriozne.
TBN matrica je 3x3 matrica koja transformise normale iz tangent space-a u world space (ili obrnuto). Svaki vertex mesha ima tri vektora:
T = tangent vector (pravac U koordinate)
B = bitangent vector (pravac V koordinate)
N = vertex normal (normala povrsine)
Matrica izgleda ovako:
| Tx Bx Nx |
| Ty By Ny |
| Tz Bz Nz |
Kada shadder procita vrednost iz tangent space normal mape (recimo (0.5, 0.3, 0.8) nakon remapiranja u [-1,1] opseg), on tu vrednost pomnozi sa TBN matricom da dobije konacnu normalu u world space-u, koju zatim koristi za osvetljenje.
worldNormal = tangentNormal.x * T + tangentNormal.y * B + tangentNormal.z * N
Ovo je razlog zasto tangent space normal mape rade sa animacijom -- T, B, i N vektori se transformisu zajedno sa meshom, pa se i rezultujuca normala automatski azurira.
Bitan detalj: UE5 interno racuna bitangent u vertex shaderu koristeci cross product tangenta i normale, plus sign vrednost sacuvanu u W komponenti tangent vektora:
B = cross(N, T) * T.w
Ta T.w vrednost (koja je +1 ili -1) odredjuje "handedness" tangent space-a i kljucna je za ispravan rad sa mirrored UV-om (o cemu ce biti vise reci u sekciji o artefaktima).
19.1.4 Baking normala -- od high-poly do low-poly
Proces kreiranja normal mapa iz visoko-detaljnog modela naziva se baking i to je jedan od najvaznijih workflow-ova u game art produkciji.
Koncept
Imas dva mesha:
- High-poly mesh -- milioni poligona, svi detalji su prava geometrija (sculpt u ZBrush-u, na primer)
- Low-poly mesh -- optimizovani game-ready mesh, obicno nekoliko hiljada poligona
Baking proces radi sledece:
- Za svaki piksel na UV mapi low-poly mesha:
- Ispali zrak (ray) od povrsine low-poly mesha u pravcu njegove normale
- Pronadji gde taj zrak pogadja high-poly mesh
- Zapisi normalu high-poly mesha u tom pogotku
- Transformisi tu normalu u tangent space low-poly mesha
- Sacuvaj rezultat kao piksel u normal mapi
Alati za baking
Najcesci alati su:
- Substance 3D Painter -- integrisani baker, vrlo popularan u industriji
- Marmoset Toolbag -- izvrstan baker sa real-time preview-om
- xNormal -- besplatan, specijalizovan za baking
- Blender -- ugradjen baker u Cycles rendereru
Cage
Vecina alata koristi koncept cage mesha -- to je blago "naduvana" verzija low-poly mesha koja definise maksimalnu udaljenost za ray casting. Cage spreclava da zraci promaashe high-poly mesh ili pogode pogresne delove geometrije.
Pravilno podesavanje cage-a je cesto razlika izmedju dobre i lose normal mape. Previise mali cage ce propustiti detalje; preveliki ce uhvatiti pogresnu geometriju.
Synced tangent basis
Kritican detalj koji mnogi pocetnici ne znaju: tangent basis koji koristi tvoj baking alat mora da se poklapa sa tangent basis-om koji koristi tvoj engine.
UE5 koristi MikkTSpace tangent basis (razvijen od strane Morten Mikkelsen-a). Kad bake-ujes normal mape za UE5, uvek:
- Exportuj low-poly mesh sa MikkTSpace tangent-ima
- U alatu za baking izaberi MikkTSpace kao tangent basis
- Importuj mesh u UE5 sa opcijom "Use MikkTSpace Tangent" ukljucenom
Ako se tangent basis ne poklapa, dobices suptilne ali iritantne greske u osvetljenju -- blagi "lumps" ili "dents" koji ne bi trebalo da budu tu.
19.1.5 Cesti artefakti i kako ih resiti
Problem sa mirrored UV
Ovo je jedan od najcescih problema sa normal mapama i vredi ga detaljno objasniti.
Kada modelujes simetrican objekat (recimo ljudsko lice), prirodno je da UV-mapiras samo jednu polovinu i onda mirror-ujes UV drugu polovinu, tako da obe strane koriste istu teksturu. Ovo stedi teksturni prostor i memoriju.
Problem nastaje na seamuu izmedju originalne i mirror-ovane strane. Zato sto je UV mirror-ovan, tangent vektor na jednoj strani gleda u suprotnom pravcu od tangenta na drugoj strani. Ako normal mapa nije svesna ove promene, dobices vidljiv seam -- liniju gde se osvetljenje naglo menja.
Resenja:
-
Ispravan sign u T.w -- Kao sto smo pomenuli, UE5 koristi T.w da kodira handedness. Mesh exporter mora pravilno da postavi ovu vrednost. Vecina modernih alata to radi automatski.
-
Seam na sredini -- Postavi UV seam tacno na liniji simetrije (obicno sredina lica, centar tela). Ne postavljaj seam na vidljivom mestu gde ce artefakt biti uocljiv.
-
Padding u teksturi -- Obezbedi dovoljno padding-a (minimum 4-8 piksela) oko UV ostrvaca da se spreci "bleeding" boja sa susednog ostrva.
-
Bake sa averaged normals na seamu -- Mnogi alati imaju opciju da koriste averaged (usrednjene) vertex normale na seamu, sto pomaze da se tranzicija izgladi.
Incorrect tangent basis
Simptomi:
- Povrsina izgleda "lumpy" ili "bubbly" cak i tamo gde bi trebalo da bude ravna
- Svetlost se odbija pod pogresnim uglom
- Promene su najuocljivije pod streaking svetlom
Resenje: Proveri da li tangent basis u baking alatu odgovara UE5 (MikkTSpace). Reimportuj mesh sa ispravnim podesavanjima.
Seams na UV ostrvacima
Cak i sa ispravnim tangent basis-om, mozes videti blage seam-ove na ivicama UV ostrva. Resenja:
- Sakri UV seam-ove na mestima koja su manje vidljiva (ispod ruku, iza usiju, na dnu objekta)
- Koristi dovoljno padding-a u teksturi
- U Substance Painter-u, koristi "match by mesh name" baking umesto "match by ray casting" za problematicne delove
19.1.6 BC5 format -- zasto ga koristiti za normal mape
Kada uvezes normal map u UE5, engine ce je podrazumevano kompresovati. Za normal mape, BC5 (ponekad nazivan "BC5 / 3Dc" ili u UE5 interfejsu "Normalmap") je daleko najbolji izbor. Evo zasto:
Kako BC5 radi
BC5 je blok kompresioni format koji cuva samo dva kanala (R i G) sa visokom preciznoscu. Treci kanal (B, tj. Z komponenta normale) se rekonstruise u shaderu iz preostala dva kanala koristeci formulu:
Z = sqrt(1 - X*X - Y*Y)
Ovo radi zato sto su normale uvek normalizovane (duzina vektora = 1), pa ako znas X i Y, mozes izracunati Z (uz pretpostavku da je Z pozitivan, sto je uvek tacno u tangent space-u).
Zasto je BC5 bolji od BC1/DXT1 ili BC3/DXT5
-
BC1 (DXT1): Kompresuje sve tri kanala zajedno sa samo 4 bita po pikselu. Korelira kanale sto dovodi do znacajnih artefakata. Normal mapa kompresovana kao BC1 ce imati vidljive blokove i pogresne normale, posebno na glatkim prelazima.
-
BC3 (DXT5): Kompresuje RGB zajedno (BC1 kvalitet) plus jedan nezavisni alpha kanal sa boljom preciznoscu. Stariji pristup je bio da se stavi X u alpha a Y u green (format poznat kao "DXT5nm"), sto daje bolji rezultat od cistog BC1, ali je BC5 superiorniji.
-
BC5: Dva potpuno nezavisna kanala, svaki sa 8-bitnom preciznoscu po bloku. Nema korelacije izmedju kanala. Rezultat je znacajno bolji kvalitet sa istom velicinom fajla kao BC3.
U UE5, kada importujes teksturu i postavis Compression Settings na Normalmap, engine automatski koristi BC5 format. Uvek koristi ovu opciju za normal mape. Nemoj ih ostavljati kao Default kompresiju.
Velicina na disku:
| Format | Bajta po pikselu | Kvalitet za normal mape |
|---|---|---|
| BC1 | 0.5 | Los |
| BC3 | 1.0 | Srednji |
| BC5 | 1.0 | Odlican |
| Nekompresovano | 4.0+ | Savrsen (ali preskupo) |
19.1.7 Reoriented Normal Mapping (RNM) -- blendovanje normal mapa
Jedna od najcescih potreba u materijalima je blendovanje dve normal mape -- na primer, imaas osnovu cigle sa velikom normal mapom za oblik cigle, i detail normal map sa sitnom teksturom povrsine cigle.
Zasto prosto "lerp" ne radi
Naivan pristup bi bio da linearno interpoliras dve normal mape:
result = lerp(normal1, normal2, alpha)
normalize(result)
Ovo daje pogresne rezultate. Linearna interpolacija normala ne cuva njihovu orjentaciju pravilno -- rezultujuce normale ce biti "spljoostene" ka (0, 0, 1) i gubice detalje obe mape.
Metoda "Whiteout Blending"
Bolji pristup, poznat kao "Whiteout Blending" (ili "partial derivative blending"):
result.xy = normal1.xy * normal2.z + normal2.xy * normal1.z
result.z = normal1.z * normal2.z
normalize(result)
Ovo daje mnogo bolje rezultate jer pravilno kombinuje "nagibe" obe mape. UE5 Material Editor ima cvor BlendAngleCorrectedNormals koji koristi upravo ovu metodu.
Reoriented Normal Mapping (RNM)
Najsavremeniji pristup, koji daje fizicki najkorektnije rezultate, je Reoriented Normal Mapping. Ovaj algoritam, koji su razvili Colin Barre-Brisebois i Stephen Hill, radi tako sto:
- Konstruise rotacionu matricu koja transformise baznu normalu (0, 0, 1) u normalu iz prve mape
- Primeni tu istu rotaciju na normalu iz druge mape
U kodu (HLSL):
float3 ReorientedNormalMapping(float3 n1, float3 n2)
{
float3 t = n1 + float3(0, 0, 1);
float3 u = n2 * float3(-1, -1, 1);
return normalize(t * dot(t, u) - u * t.z);
}
RNM daje najbolje rezultate jer:
- Pravilno cuva pravce obe normal mape
- Radi ispravno i pod ekstremnim uglovima
- Rezultat je uvek normalizovan vektor koji lezi na ispravnoj polusferi
U UE5 Material Editoru, ako zelis da koristis RNM, mozes ga implementirati kao Custom Expression ili Material Function. Za vecinu slucajeva, medjutim, BlendAngleCorrectedNormals cvor daje dovoljno dobre rezultate.
Prakticni savet
Kada blendujess normal mape u materijalu:
- Drzi baznu (makro) normal map na prvom ulazu
- Drzi detail (mikro) normal map na drugom ulazu
- Koristi
BlendAngleCorrectedNormalscvor - Rezultat prikljuci na Normal ulaz materijala
[Base Normal Map] ----\
>-- [BlendAngleCorrectedNormals] --> [Normal]
[Detail Normal Map] --/
19.2 Parallax Mapping
19.2.1 Motivacija -- dubina bez geometrije
Normal mapping menja samo osvetljenje -- silueta objekta ostaje potpuno ravna. Ako pogledas ciglu sa normal map-om pod ostrrim uglom, videces da su cigle "nalepljene" na ravnu povrsinu. Nema stvarne dubine, nema okluzije, malter izmedju cigala ne "tone" u zid.
Parallax mapping je familija tehnika koje simuliraju dubinu pomeranjem UV koordinata na osnovu height mape i ugla posmatranja. Rezultat je vizuelni utisak dubine koji je mnogo uverljiviji od samog normal mapping-a, a da pritom ne zahteva dodatnu geometriju.
19.2.2 Basic Parallax Mapping (Simple Offset)
Najjednostavnija forma parallax mapping-a radi ovako:
- Imamo height map -- grayscale tekstura gde belo = visoko, crno = nisko
- Racunamo view direction u tangent space-u
- Pomeramo UV koordinate u pravcu suprotnom od view direction-a, skalirane visinom
Formalno:
heightValue = sample(heightMap, uv)
offset = viewDir.xy / viewDir.z * heightValue * scale
newUV = uv - offset
Zatim koristimo newUV umesto originalnih uv za sve ostale texture sample-ove (albedo, normal, roughness, itd).
Intuicija: Zamisli da gledas pod uglom na povrsinu sa udubljenjem. Dno udubljenja bi trebalo da bude vidljivo na malo drugom mestu nego sto bi bilo da je povrsina ravna. Pomeranjem UV-a u smeru suprotnom od pogleda, simuliramo ovaj efekat.
Problemi sa basic parallax-om
- Deljenje sa viewDir.z postaje problematicno pod malim uglovima (grazing angles) -- moze dovesti do ekstremnog pomeranja UV-a
- Samo jedno pomeranje -- nema iteracije, pa je rezultat priblizaan samo za male vrednosti scale-a
- Nema self-occlusion -- visi delovi ne zaklanjaju nize
Uprkos ogranicenjima, basic parallax je izuzetno jeftin (samo jedan dodatni texture sample) i moze dati pristojne rezultate za suptilne efekte dubine.
U UE5 Material Editoru, mozes implementirati basic parallax ovako:
- Dodaj
Camera Vectorcvor (daje view direction u world space) - Transformisi ga u tangent space koristeci
Transform Vectorcvor - Izracunaj offset koristeci visinu iz height mape
- Dodaj offset na UV koristeci
Addcvor - Koristi nove UV za sve texture sample-ove
19.2.3 Steep Parallax Mapping
Steep parallax mapping resava mnoge probleme basic metode koristeci iterativni pristup:
- Podeli raspon visine u N jednake slojeve (layers)
- Kreni od vrha (kamera) i kraci niz height field u koracima
- Na svakom koraku, uporedi trenutnu dubinu sa visinom iz height mape
- Kada nadjes korak gde si "zaronijo" ispod height field-a, stani -- to je priblizna tacka preseka
// Pseudo-kod za steep parallax
layerDepth = 1.0 / numLayers
currentDepth = 0
currentUV = startUV
for (i = 0; i < numLayers; i++)
{
heightFromMap = sample(heightMap, currentUV)
if (currentDepth > heightFromMap)
break; // Nasli smo presek
currentUV += uvStep
currentDepth += layerDepth
}
Vise slojeva = bolji rezultat, ali i vise texture sample-ova. Tipicno se koristi 8-32 sloja, cesto vise pod ostrijim uglovima posmatranja (gde je greska veca).
Banding artefakt: Posto se koristi diskretan broj slojeva, moze se videti "stepenicasti" efekat na ivicama. Ovo se resava linearnom interpolacijom izmedju poslednja dva koraka (gde se presao iz "iznad" u "ispod" height field-a). Ova varijanta se naziva Parallax Mapping with Relief Mapping ili jednostavno relief mapping.
19.2.4 Parallax Occlusion Mapping (POM)
POM je najnaprednija varijanta parallax mapping-a i ona koja je najcesace koriscena u profesionalnim projektima. UE5 ima ugradjeni Parallax Occlusion Mapping cvor u Material Editoru koji sve ovo implementira za tebe.
Kako POM radi
POM kombinuje steep parallax sa binarnom pretragom za preciznije nalazenje preseka:
- Ray Marching faza: Isto kao steep parallax -- koraca kroz height field u diskretnim koracima dok ne pronadje presek
- Refinement faza: Kada nadje priblizni presek, vrsi 3-5 koraka binarne pretrage izmedju poslednja dva linearna koraka za precizno nalazenje tacke preseka
- UV Offset: Racuna finalne UV koordinate na osnovu tacke preseka
Self-shadowing u POM
Jedan od najimpresivnijih efekata POM-a je self-shadowing -- sposobnost da visi delovi height field-a bacaju senku na nize delove.
Princip rada:
- Nakon sto nadjes tacku na povrsini (kroz ray march od kamere), ispali drugi zrak od te tacke ka svetlu
- Ako taj zrak pogodi height field pre nego sto izadje, tacka je u senci
- Rezultat koristi za atenuaciju direktnog osvetljenja
Self-shadowing dramaticno poboljsava uverljivost, ali dupllira broj texture sample-ova jer zahteva drugi ray march.
UE5 Parallax Occlusion Mapping cvor
U UE5 Material Editoru, POM cvor (ParallaxOcclusionMapping) ima sledece ulaze:
- Heightmap Texture -- teksturna referenca height mape (ne Texture Sample, vec Texture Object!)
- Heightmap Channel -- koji kanal teksture sadrzi visinu (obicno R)
- Height Ratio -- kolika je "dubina" efekta (tipicno 0.01 - 0.1)
- Min Steps / Max Steps -- opseg broja koraka za ray march (vise = kvalitetnije ali skuplje)
- UV koordinate -- bazne UV koordinate
Izlazi:
- Parallax UVs -- pomerene UV koordinate (koristi ih za SVE texture sample-ove!)
- Pixel Depth Offset -- korekcija dubine za Z-buffer (omogucava pravilnu intersekciju sa drugom geometrijom)
Vazan detalj: Pixel Depth Offset je veoma koristan jer bez njega POM geometrija nece pravilno "ulaziti" u drugu geometriju na ivicama -- videces ostar rez gde se mesh zavrsava. Sa PDO, dubina u Z-bufferu se koriguje da prati virtualnu POM povrsinu.
Performanse POM-a
POM je skup efekat. Evo zasto:
- Svaki piksel radi 8-64 texture sample-ova samo za nalazenje preseka
- Sa self-shadowing-om, to se duplira
- Svaki od tih sample-ova cita iz height mape, sto opterecuje texture cache
Prakticna pravila za performanse:
| Parametar | Niska cena | Srednja cena | Visoka cena |
|---|---|---|---|
| Min Steps | 4 | 8 | 16 |
| Max Steps | 16 | 32 | 64 |
| Self-shadow | Ne | -- | Da |
| Tipicna upotreba | Podovi daleko od kamere | Zidovi srednje udaljenosti | Hero asset-i blizu kamere |
Kada koristiti POM umesto displacement-a
POM je bolji izbor kada:
- Mesh je relativno ravan (zidovi, podovi, tereni)
- Silueta nije kriticna (POM ne menja siluetu!)
- Dubina detalja je umerena
- Performanse su prioritet
Displacement je bolji kada:
- Silueta mora biti pravilna (kamenovi, planine)
- Potrebne su prave senke (shadow maps)
- Koristis Nanite koji moze da podnese visoku geometriju
- Kvalitet je prioritet nad performansama
19.3 Displacement Mapping
19.3.1 Prava geometrija iz teksture
Za razliku od normal mapping-a (koji samo menja osvetljenje) i parallax mapping-a (koji samo pomera UV-e), displacement mapping zaista pomera vertekse mesha na osnovu height mape. To znaci da dobijas:
- Pravilnu siluetu -- ivice objekta se menjaju u skladu sa height mapom
- Prave senke -- shadow map-e pravilno prate displacement
- Korektnu okluziju -- ambient occlusion i screen space efekti rade ispravno
- Pravilne refleksije -- ray-traced refleksije vide pravu geometriju
Ali ovo ima cenu -- da bi pomerao vertekse, moras imati dovoljno verteksa. Mesh sa 4 verteksa (jedan quad) ne moze prikazati detaljan displacement jer nema sta da se pomera.
19.3.2 Tessellation u UE5
Tradicionalno, displacement mapping se koristio sa hardverskom teselacijom -- GPU bi dinamicki delio poligone na manje delove pre displacement-a.
Vazna napomena: UE5 je ukinuo tradicionalnu hardversku teselaciju u korist Nanite-a. Stari tessellation materijali iz UE4 nece raditi u UE5 sa Lumen/Nanite renderingom.
Medjutim, postoje situacije gde jos uvek mozes koristiti displacement:
Opcija 1: World Position Offset
U UE5 materijalu, World Position Offset ulaz na Material node-u ti dozvoljava da pomeris vertekse u world space-u. Ovo se racuna u vertex shaderu.
Pristup:
- Sample-uj height map u vertex shaderu (koristeci UV koordinate)
- Pomnozi visinu sa normalom povrsine
- Prikaci rezultat na World Position Offset
[Height Map (VS)] --> [Multiply] --> [World Position Offset]
^
[Vertex Normal] --------/
Ogranicenje: Ovo radi samo na postojecim verteksima. Ako mesh nema dovoljno poligona, displacement ce biti grub i "poligonalan". Resenje je da mesh ima visok poly count, sto ponistava ideju o stednji geometrije.
Opcija 2: Nanite Displacement (UE 5.4+)
Unreal Engine 5.4 je uveo Nanite Tessellation koja kombinuje Nanite-ovu efikasnost sa displacement mapping-om. Ovo je revolucionarna funkcionalnost jer:
- Nanite dinamicki odredjuje koliko trougolova je potrebno na osnovu udaljenosti od kamere
- Displacement se primenjuje na teselirane trouglove
- Rezultat ulazi u Nanite-ov virtualni geometry pipeline za efikasan rendering
Da bi koristio Nanite displacement:
- Mesh mora biti Nanite-enabled (Settings > Enable Nanite u Static Mesh editoru)
- U materijalu, omoguci Displacement u Material Properties
- Prikaci height map na Displacement ulaz materijala
- Podesi Displacement Magnitude -- koliko se verteksi pomeraju (u Unreal jedinicama, tj. centimetrima)
Napomena: U vreme pisanja ovog teksta, Nanite displacement je relativno nova funkcionalnost i moze imati ogranicenja u nekim workflow-ovima. Proveravaj Release Notes za najnovije informacije.
19.3.3 Prakticna razmatranja
Height map kvalitet
Za displacement, height map mora biti visokog kvaliteta:
- 16-bit ili 32-bit preciznost -- 8-bitna height map (256 nivoa sive) ce proizvesti vidljive "stepenice" u displacement-u
- Dovoljno rezolucije -- displacement zahteva vise detalja nego normal mapping jer se vidi iz svakog ugla
- Smooth padding -- nagli prelazi u height mapi postaju nagle promene geometrije
Kombinovanje displacement-a sa normal mapping-om
Cest workflow u profesionalnoj produkciji:
- Macro displacement -- krupni oblici (kameni blokovi, velika udubljenja) rade se sa displacement-om
- Micro detail -- sitni detalji (tekstura kamena, pukotice) rade se sa normal map-om
Ovo daje najbolji odnos kvaliteta i performansi -- displacement obezbjedjuje pravilnu siluetu i makro senke, a normal map dodaje sitne detalje osveetljenja.
Shadow casting
Jedna od najvecih prednosti displacement-a nad parallax-om je pravilno bacanje senki. Displaced geometrija:
- Pravilno se pojavljuje u shadow map-ama
- Moze da baca senke na druge objekte
- Moze da prima senke od drugih objekata na ispravan nacin
Ovo je posebno vazno za terene i velike povrsine gde POM self-shadowing ne moze da zameni prave shadow map senke.
Correct silhouettes
Mozda najociglednija prednost displacement-a. Zamisli kamen:
- Sa normal map-om: Silueta je potpuno glatka -- kamen izgleda kao jabuka pod pravim svetlom, ali profil otkriva da je to glatki mesh
- Sa POM-om: Bolji utisak dubine na povrsini, ali silueta je i dalje glatka
- Sa displacement-om: Silueta je nepravilna, sa pravim izbocinama i udubljenjima -- izgleda kao pravi kamen iz svakog ugla
19.3.4 Performanse displacement-a
Displacement mapping je najskuplja od svih tehnika u ovom poglavlju. Razlozi:
- Visok polygon count -- bilo da koristis pre-tessellated mesh ili runtime tessellation, broj poligona dramaticno raste
- Vertex shader cost -- displacement se racuna za svaki vertex, sto ukljucuje texture sample u vertex shaderu (sto je manje efikasno nego u pixel shaderu)
- Overdraw -- displaced geometrija moze izazvati vece overdraw jer se menja dubina piksela
- Shadow pass -- vise poligona znaci i skuplji shadow pass
Nanite znacajno ublazava ove probleme jer:
- Automatski redukuje poligone na osnovu udaljenosti
- Koristi visibility buffer koji minimizuje overdraw
- Efikasno handluje ogromne kolicine poligona
Uprkos ceni, displacement je gold standard za visoko-kvalitetne povrsine u filmskim i AAA produkcijama.
19.4 Detail Textures
19.4.1 Problem blizine kamere
Zamisli da imas teren sa teksturom zemlje. Na normalnoj udaljenosti izgleda sjajno -- boja je lepa, normal map daje utisak neravnina. Ali kada se kamera priblizi, tekstura pocinje da gubi detalje i postaje "muddy" -- pikseli postaju preveliki i vidi se da je to samo slika nalepljena na poligone.
Detail textures resavaju ovaj problem dodavanjem visoko-frekventnog detalja koji je tile-ovan na mnogo visem nivou od bazne teksture.
19.4.2 Kako detail textures rade
Princip je jednostavan:
- Imas baznu teksturu (albedo, normal) koja se tile-uje na normalnom nivou (recimo, jednom po metru)
- Imas detail teksturu koja se tile-uje na mnogo visem nivou (recimo, deset puta po metru)
- Blendujees ih tako da detail tekstura dodaje detalj bez da menja ukupni izgled
Detail Albedo
Za albedo, detail tekstura se obicno blenduje koristeci overlay ili multiply mod:
Overlay blending:
if (base < 0.5)
result = 2 * base * detail
else
result = 1 - 2 * (1 - base) * (1 - detail)
Multiply-then-double blending:
result = base * detail * 2
Druga metoda je jednostavnija i daje dobre rezultate. Kljucno je da je detail tekstura oko srednje vrednosti (0.5) -- svetlije oblasti dodaju svetle detalje, tamnije dodaju tamne detalje, ali ukupna svetlina bazne teksture se cuva.
U UE5 Material Editoru:
[Base Albedo (UV * 1)] ----\
>-- [Multiply] --> [Multiply by 2] --> [Base Color]
[Detail Albedo (UV * 10)] -/
Detail Normal Map
Za normale, koristimo vec pomenuti BlendAngleCorrectedNormals cvor:
[Base Normal (UV * 1)] ------\
>-- [BlendAngleCorrectedNormals] --> [Normal]
[Detail Normal (UV * 10)] ---/
Bazna normal mapa daje krupne oblike (cigle, kameni blokovi), dok detail normal mapa daje sitnu teksturu povrsine (hrapavost, pore, mikro-pukotice).
19.4.3 UV Scale razlike
Razlika u UV scale-u izmedju bazne i detail teksture je kljucna za efekat:
- Premali scale (npr. 2x) -- detail se jedva primecuje, ne resava problem
- Previsok scale (npr. 50x) -- detail se tile-uje previse occigledno, vidi se repeticija
- Optimalan opseg -- obicno 4x do 15x veci scale od bazne teksture
DetailUV = BaseUV * DetailTilingScale
Gde je DetailTilingScale parametar koji mozes podesavati u Material Instance-u.
19.4.4 Distance-based blending
Pametan trik je da detail teksture blendujees na osnovu udaljenosti od kamere:
- Blizu kamere: Detail tekstura je potpuno vidljiva
- Daleko od kamere: Detail tekstura se fade-uje, ostaje samo bazna
Ovo ima dve prednosti:
- Eliminise tiling artefakte na velikoj udaljenosti -- detail tekstura se ne vidi dovoljno daleko da bi se repeticija primetila
- Stedi performanse -- na velikoj udaljenosti, detail texture sample-ovi se mogu preskociti
U UE5:
Distance = length(CameraPosition - WorldPosition)
DetailBlend = saturate((FadeDistance - Distance) / FadeRange)
FinalAlbedo = lerp(BaseAlbedo, BaseAlbedo * DetailAlbedo * 2, DetailBlend)
19.4.5 Prakticni workflow
- Kreiraj baznu teksturu -- ovo je tvoja glavna tekstura sa ukupnim izgledom materijala
- Kreiraj detail teksturu -- ovo je tileable tekstura sa sitnim detaljima
- Detail albedo treba da bude oko srednje sivee (0.5) da ne bi menjao ukupnu boju
- Detail normal treba da bude suptilan -- ako je prejak, izgubices makro oblike
- Podesi tiling -- eksperimentisi sa razlicitim scale vrednostima
- Dodaj distance fade -- da se izbeggne vidljiva repeticija na daljini
- Napravi Material Instance -- izlozi tiling scale i fade distance kao parametre
19.5 Texture Blending Techniques
19.5.1 Zasto nam treba blendovanje tekstura
U realnom svetu, materijali se retko zavrsavaju ostrrim ivicama. Sneg prekriva stene na planini, mahovinom obrasta kamen u sumi, pesak prelazi u travu na plazi. Da bismo reprodukovali ove prelaze u igrama, moramo da blendujemo razlicite teksture na istoj povrsini.
UE5 nudi vise nacina za blendovanje, od jednostavnih do izuzetno sofisticiranih.
19.5.2 Simple Lerp Blending
Najjednostavniji pristup -- linearna interpolacija dve teksture na osnovu mask-e:
result = lerp(textureA, textureB, mask)
Gde je mask vrednost od 0 do 1 (obicno iz vertex color-a, posebne teksture, ili proceduralnog izvora).
mask = 0--> samo textureAmask = 1--> samo textureBmask = 0.5--> 50/50 mesavina
Problem: Rezultat izgleda lose. Prelaz je mekan, "muljevit" -- kao da su dva materijala prosto rastvorena jedan u drugom. U realnom svetu, sneg na kamenu ne izgleda kao poluprovidan sneg blendovan sa poluprovitdnim kamenom. Sneg lezi na vrhu kamena, sa ostrim prelazima po visini terena.
// Primer u UE5 Material Editoru
[Rock Albedo] ----\
>-- [Lerp (Alpha = Vertex Color R)] --> [Base Color]
[Snow Albedo] ----/
Lerp blending je koristan za:
- Prelaze izmedju varijacija istog materijala (svetlija/tamnija verzija iste cigle)
- Wet/dry prelaze (mokra/suva povrsina)
- Situacije gde mekan prelaz izgleda prirodno
Za sve ostalo, postoji bolji nacin.
19.5.3 Height-Based Blending
Height-based blending je tehnika koja koristi height mape oba materijala da odredi koji je "visi" i zato bi trebalo da bude vidljiv. Ovo proizvodi mnogo realisticnije prelaze.
Kako radi
Princip je elegantno jednostavan:
- Imas height map za svaki materijal
- Na svakom pikselu, poredis visine oba materijala
- Materijal sa vecom visinom "pobedjuje" i postaje vidljiv
Ali umesto hard cut-off-a, dodajes blend zonu za glatki prelaz:
float HeightBlend(float heightA, float heightB, float mask, float blendSharpness)
{
float adjustedA = heightA + (1.0 - mask); // Povecaj A gde mask kaze "A"
float adjustedB = heightB + mask; // Povecaj B gde mask kaze "B"
float maxHeight = max(adjustedA, adjustedB);
float threshold = maxHeight - blendSharpness;
float weightA = max(adjustedA - threshold, 0);
float weightB = max(adjustedB - threshold, 0);
return weightB / (weightA + weightB); // Normalizovan blend factor
}
Vizuelni rezultat
Razlika je dramaticna:
- Lerp: Sneg i kamen se "mescaju" u siv rastvor na prelazu
- Height-based: Sneg se nakuplja u udubljenjima kamena prvo, zatim prekriva vise delove. Na prelazu vidis ostre ivice gde sneg "dodiruje" kamen, bas kao u prirodi.
Za kamme obraslao mahovinom:
- Lerp: Kamen je zelenkast na prelazu -- izgleda kao obojen kamen
- Height-based: Mahovina raste u pukotinama i udubljenjima, visocije delove kamena ostavlja cistim
Blend Sharpness parametar
blendSharpness (ponekad nazivan "contrast" ili "hardness") kontrolise koliko je ostar prelaz:
- Visoka vrednost (npr. 0.5) -- mekan prelaz, slican lerp-u
- Niska vrednost (npr. 0.05) -- ostar prelaz, skoro binarno A ili B
- Optimalna vrednost -- obicno 0.1-0.2, daje prirodan prelaz sa jasno definisanim ivicama
19.5.4 Implementacija u UE5
Evo korak-po-korak kako da napravis height-based blending u UE5 Material Editoru:
-
Kreiraj dve grupe tekstura: Za svaki materijal ti treba albedo, normal, roughness/metallic, i height map
-
Dodaj blend mask: Ovo moze biti:
- Vertex Color (najcesci pristup -- paintuj direktno na meshu)
- Zasebna tekstura
- World Position bazirani izvor (npr. visina u svetu za sneg)
-
Izracunaj height-based blend factor:
// U Material Editoru koristeci math cvorove:
HeightA = [Rock Height Map]
HeightB = [Snow Height Map]
Mask = [Vertex Color R]
AdjustedA = HeightA + (1 - Mask)
AdjustedB = HeightB + Mask
MaxH = Max(AdjustedA, AdjustedB)
Threshold = MaxH - BlendSharpness
WeightA = Max(AdjustedA - Threshold, 0)
WeightB = Max(AdjustedB - Threshold, 0)
FinalBlend = WeightB / (WeightA + WeightB + 0.001)
// Dodajemo 0.001 da izbegnemo deljenje nulom
- Primeni blend factor na sve kanale:
FinalAlbedo = Lerp(RockAlbedo, SnowAlbedo, FinalBlend)
FinalNormal = BlendAngleCorrectedNormals(RockNormal, SnowNormal, FinalBlend)
FinalRoughness = Lerp(RockRoughness, SnowRoughness, FinalBlend)
- Material Instance parametri:
Izlozi kao parametre:
- Blend Sharpness (Scalar)
- Tiling za svaki materijal (Scalar)
- Eventualne boje za tinting (Vector)
19.5.5 Vertex Color painting
UE5 ima ugradjeni alat za vertex color painting (Mesh Paint Mode). Ovaj alat ti dozvoljava da direktno "farbbas" vertex boje na mesh u editoru.
Prednosti:
- Besplatno -- vertex boje ne zahtevaju dodatne teksture
- Per-vertex kontrola -- mozes precizno odrediti gde se blend desava
- 4 kanala (RGBA) -- mozes imati do 4 nezavisne mask-e
Ogranicenja:
- Rezolucija zavisi od vertex density-ja -- ako mesh ima malo verteksa, blend ce biti grub
- Ne radi sa instancing-om -- svaka instanca mesha mora imati sopstvene vertex boje
- Teze za proceduralni pristup -- rucno paintovanje je sporo za velike terene
19.5.6 Napredne varijacije
Tri-materijal blending
Isti princip mozes prosiriti na tri ili vise materijala koristeci razlicite kanale vertex boja:
- R kanal -- blend faktor za materijal B
- G kanal -- blend faktor za materijal C
- A kanal (1 - R - G) -- implicitni faktor za materijal A
Height-based blending se racuna za svaki par materijala.
World-aligned blending
Za efekat poput sneg-a koji prekriva sve od gore, mozes koristiti world space normal kao mask:
SnowMask = saturate(dot(WorldNormal, float3(0, 0, 1)))
SnowMask = pow(SnowMask, SnowFalloff) // Kontrolise koliko je sneg "ostar"
Ovo automatski stavlja sneg na svaku povrsinu koja gleda nagore, bez ikakvog rucnog paintovanja. Kombinovano sa height-based blending-om, daje izuzetno prirodan rezultat.
Macro variation
Cak i sa height-based blending-om, ponavljanje tekstura na velikoj povrsini moze biti ocigledno. Dodavanje macro variation teksture (velika, nisko-rezoluciona tekstura varijacije) pomaze:
MacroVariation = sample(macroVariationMap, worldUV * 0.01) // Veoma mali tiling
BlendSharpness *= MacroVariation // Varira ostrrinu prelaza
19.6 Triplanar Mapping
19.6.1 Problem sa UV koordinatama
U normalnim okolnostima, svaki mesh ima UV koordinate koje definisu kako se tekstura "obmotava" oko njega (detaljno objasnjeno u Poglavlju 04). Ali postoje situacije gde UV koordinate ne postoje, ne rade dobro, ili ih je nemoguce napraviti:
- Proceduralno generisana geometrija -- meshevi kreirani u runtime-u nemaju UV-e
- Voxel tereni -- geometrija koja se dinamicki menja
- Stene i prirodni oblici -- tesko je napraviti UV-e za organske oblike bez vidljivih seam-ova
- Tereni -- UE5 Landscape koristi svoj sistem, ali custom tereni mogu imati probleme
Triplanar mapping resava ove probleme tako sto potpuno zaobilazi UV koordinate i umesto toga projektuje teksture iz tri ortogonalne ose (X, Y, Z).
19.6.2 Kako triplanar mapping radi
Princip je sledeci:
-
Tri projekcije: Za svaki piksel, uzmi tri uzorka teksture:
- Sa X ose -- koristi YZ world koordinate kao UV
- Sa Y ose -- koristi XZ world koordinate kao UV
- Sa Z ose -- koristi XY world koordinate kao UV
-
Blend na osnovu normale: Odredi koliko je povrsina okrenuta ka svakoj osi koristeci apsolutnu vrednost world space normale:
float3 blendWeights = abs(worldNormal);
blendWeights = normalize(blendWeights); // Normalizuj da suma bude 1
- Pomesaj tri uzorka:
float4 texX = sample(texture, worldPos.yz * tiling);
float4 texY = sample(texture, worldPos.xz * tiling);
float4 texZ = sample(texture, worldPos.xy * tiling);
float4 result = texX * blendWeights.x
+ texY * blendWeights.y
+ texZ * blendWeights.z;
Rezultat: Povrsina koja gleda nagore (pod, teren) koristi uglavnom Z projekciju. Vertikalni zid koji gleda na istok koristi uglavnom X projekciju. I tako dalje. Na kosim povrsinama, dve ili tri projekcije se blenduju, dajuci gladak prelaz.
19.6.3 Poboljsanja osnovnog pristupa
Sharpness kontrola
Bazni triplanar cesto daje previse mekan prelaz na ivicama. Dodavanje eksponenta (sharpness) pomaze:
blendWeights = pow(abs(worldNormal), sharpness);
blendWeights /= (blendWeights.x + blendWeights.y + blendWeights.z);
Sa sharpness = 1, prelaz je mekan. Sa sharpness = 4 ili vise, prelaz postaje ostriji i svaka projekcija dominira na svojoj strani.
Normal map u triplanar-u
Triplanar mapping sa normal mapama zahteva dodatni korak -- normale iz svake projekcije su u razlicitim koordinatnim sistemima i moraju se pravilno transformisati:
Za svaku projekciju:
- Procitaj normalu iz normal mape (tangent space)
- Reorjentisi je da odgovara osi projekcije:
// Za X projekciju (YZ ravaan)
normalX = float3(normalMap.z, normalMap.y, -normalMap.x);
// Za Y projekciju (XZ ravan)
normalY = float3(normalMap.x, normalMap.z, -normalMap.y);
// Za Z projekciju (XY ravan)
normalZ = float3(normalMap.x, normalMap.y, normalMap.z); // Trivijalan slucaj
- Blenduj korigovane normale sa tezinama
Ovo je cesto izvor gresaka -- ako ne transformises normale pravilno, dobices cudne artefakte u osvetljenju na prelazima izmedju projekcija.
Tiling i offset
Posto triplanar koristi world position za UV, mozes kontrolisati tiling i offset:
float2 uvX = worldPos.yz * tiling + offset;
float2 uvY = worldPos.xz * tiling + offset;
float2 uvZ = worldPos.xy * tiling + offset;
Bitan detalj: Ako pomeras objekat u svetu, tekstura se nece pomeriti sa njim -- jer je bazirana na world position-u, ne na object position-u! Ako zelis da tekstura prati objekat, koristi Object Position umesto World Position:
// U UE5 Material Editoru
[ObjectPosition] umesto [WorldPosition] za projekciju
19.6.4 Performansni aspekti
Triplanar mapping je tri puta skuplji od obicnog teksturiranja jer zahteva tri texture sample-a umesto jednog. Za materijal sa 4 teksture (albedo, normal, roughness, height), to je 12 texture sample-ova umesto 4.
Optimizacije:
-
Reduce na dve projekcije: Ako znas da neka osa nikad nece biti dominantna (npr. za teren gde je Z uvek gore), mozes izbaciti jednu projekciju
-
Single-axis fallback: Na malim uglovima, koristi samo jednu projekciju umesto tri:
if (maxWeight > 0.95)
result = dominantAxisSample; // Samo jedna projekcija
else
result = triplanarBlend; // Pune tri projekcije
-
Channel packing: Pakuj razlicite informacije u kanale jedne teksture da smanjis ukupan broj texture sample-ova
-
LOD bias: Koristi nizi mip level za manje dominantne projekcije
19.6.5 Kada koristiti triplanar mapping
Koristi triplanar za:
- Stene i prirodne objekte gde je tesko napraviti dobre UV-e
- Proceduralno generisanu geometriju
- Voxel terene i destructible mesheve
- Quick prototyping -- brzo teksturiraj mesh bez UV unwrap-a
- Materijale za Landscape koji koriste world-aligned blending
Ne koristi triplanar za:
- Character modele i organske oblike (UV-i su bolji za kontrolu)
- Artefakte/objekte sa specificnom teksturnom distribucijom
- Situacije gde su performanse kriticne i triplanar je preskup
- Objekte koji zahtevaju precizno UV mapiranje (tekst na znakovima, logotipi)
19.6.6 Implementacija u UE5 Material Editoru
UE5 nema ugradjen "Triplanar" cvor, ali implementacija je straightforward:
- World Position:
WorldPositioncvor (iliObjectPositionza object-relative) - World Normal:
VertexNormalWSiliPixelNormalWScvor - Tri Texture Sample-a: Svaki sa razlicitim parom koordinata iz world position-a
- Abs + Power + Normalize: Za blend weights
- Multiply + Add: Za finalnu kombinaciju
Mozess ovo zamotati u Material Function da bi ga lako ponovo koristio u razlicitim materijalima. Mnogi studiji imaju biblioteku Material Function-a koja ukljucuje triplanar mapping.
19.7 Decals
19.7.1 Sta su decali i zasto su vazni
Decali (dekali) su nacin da projektujees materijal na postojece povrsine bez modifikovanja originalnih mesheva ili materijala. Zamisli ih kao "nalepnice" koje lepis na svet.
Primeri upotrebe:
- Ostecenja -- rupe od metaka, pukotine, ogrebotine
- Fleke -- krv, ulje, blato, voda
- Natpisi -- grafiti, znakovi, brojevi soba
- Ambijent -- lissce, prljavstina, vlaga na zidovima
- Gameplay elementi -- markeri, indikatori
Decali su izuzetno korisni jer ti dozvoljavaju da dodas unikatni detalj svakoj sceni bez kreiranja unikatnih tekstura za svaki mesh.
19.7.2 Kako decali rade -- tehniki pregled
Princip decal renderinga:
- Decal volume: Decal se definise kao box (kutija) u prostoru scene
- Projekcija: Engine renderuje ovaj box i za svaki piksel unutar njega:
- Odredjuje gde piksel "pada" na scenu (koristeci depth buffer)
- Racuna UV koordinate na osnovu projekcije kutije
- Sample-uje decal teksture koristeci te UV-e
- Blenduje rezultat sa postojecim podacima u G-buffer-u (ili frame buffer-u)
Kljucni detalj: Decali se renderuju kao geometrija (box mesh) ali njihov efekat je screen-space projekcija -- oni se "projektuju" na sve sto se nalazi unutar njihovog volume-a.
19.7.3 Tipovi decala u UE5
UE5 ima dva glavna sistema za decale, i razumevanje razlika je kljucno za pravilnu upotrebu:
Deferred Decals
Deferred decali se renderuju tokom deferred rendering pass-a, nakon sto je G-buffer popunjen ali pre nego sto je osvetljenje izracunato.
Karakteristike:
- Mogu da modifikuju Base Color, Normal, Roughness, Metallic, i druge G-buffer kanale
- Rade sa Lumen osvetljenjem
- Podrzavaju sortiiranje (vise decala jedan preko drugog)
- Relativno jeftini jer operisu na G-buffer nivou
Da kreiras deferred decal u UE5:
- Kreiraj novi Material sa Domain podesenim na Deferred Decal
- U Decal Blend Mode izaberi sta zeliss da modifikujes:
- Translucent -- modifikuje boju (Base Color + opciono druge kanale)
- Stain -- modifikuje samo boju, ne i normale
- Normal -- modifikuje samo normale
- DBuffer Translucent -- koristi DBuffer (vidii ispod)
- Drugi modovi za specificne potrebe
- Postavi teksture i logiku materijala
- Kreiraj Decal Actor u sceni i dodeli mu materijal
- Podesi velicinu i orijentaciju box-a
DBuffer Decals
DBuffer (Decal Buffer) decali su napredniji sistem koji se renderuje pre G-buffer pass-a. Podaci se cuvaju u posebnom buffer-u koji se zatim primenjuje tokom base pass-a.
Prednosti DBuffer decala:
- Rade sa Nanite geometrijom (obicni deferred decali mogu imati probleme sa Nanite-om)
- Pravilno se integrisu sa svim materijalima, ukljucujuci transparentne
- Bolje blendovanje sa baznim materijalom
- Podrzavaju per-pixel normal blending za reallisticnije rezultate
Mane:
- Zahtevaju da je
DBuffer Decalsomogucen u Project Settings (Rendering sekcija) - Blago skupljii od obicnih deferred decala
- Dodatni memorijski cost za DBuffer
Da bi koristio DBuffer decale:
- Omoguci
DBuffer Decalsu Project Settings > Rendering > DBuffer Decals - U materijalu, postavi Decal Blend Mode na jedan od DBuffer modova:
- DBuffer Translucent Color, Normal, Roughness (najcesci -- modifikuje sve)
- DBuffer Translucent Color, Normal (bez roughness modifikacije)
- DBuffer Translucent Color (samo boja)
Za Nanite projekte, DBuffer decali su preporuceni jer obicni deferred decali mogu ne raditi pravilno na Nanite meshevima u nekim situacijama.
19.7.4 Automatski decali -- Decal Component i Blueprints
U praksi, decale ces cesto postavljati programatski:
Primer: Metci koji ostavljaju rupe
- Kreiraj decal material za rupu od metka (albedo sa alpha, normal map za "udubljenje")
- U Blueprint-u za pogodak (Hit Event):
- Spawn Decal at Location
- Podesi rotaciju da decal "gleda" u pravcu normale pogodjeene povrsine
- Postavi lifetime (npr. 30 sekundi) nakon kog decal nestaje
- Opciono: Fade out pre nestanka
// Blueprint pseudo-kod
OnHit(HitLocation, HitNormal):
Rotation = HitNormal.ToRotation()
SpawnDecalAtLocation(BulletHoleMaterial, Size, HitLocation, Rotation)
Primer: Krvave fleke
Slicno, ali sa randomizacijom:
- Vise varijacija tekstura (3-5 razlicitih krvaavih fleka)
- Random rotacija oko normale
- Random velicina (scale)
- Opciono: Animiran material koji simulira sirenje fleke
19.7.5 Performanse decala
Decali imaju performansnu cenu koja zavisi od:
- Velicina decala na ekranu -- veci decal = vise piksela za obradu = skuplje
- Broj decala -- svaki decal je dodatni draw call i fill operacija
- Kompleksnost materijala -- kompleksniji decal materijal = skuplja obrada
- Overlap -- preklapanje vise decala na istom mestu multiplicira cost
Prakticna pravila:
- Drzi decale male -- ne koristi ogroman decal gde moze mali
- Limitiraj broj -- 50-100 aktivnih decala je razuman opseg za vecinu scena; stotine mogu da uspore rendering
- Koristi LOD -- fade-uj ili ukloni decale na velikoj udaljenosti
- Pooling -- recikliraj decal actore umesto da stalno kreiras nove
- Bake-uj staticne decale -- za decale koji se nikad ne menjaju, razmotri da ih bake-ujes u teksturu mesha
19.7.6 Decal Sorting i prioritet
Kada se vise decala preklapa, redosled renderovanja odredjuje koji je "ispred":
- UE5 koristi Sort Order vrednost na Decal Component-u
- Nizi Sort Order se renderuje prvi (ispod)
- Visi Sort Order se renderuje poslednji (iznad)
Prakticno: Ako imas decal za prljavstinu (Sort Order = 0) i decal za rupu od metka (Sort Order = 1), rupa ce uvek biti "iznad" prljavstine, sto je vizuelno logicno -- metak je napravljen nakon sto se prljavstina nakupila.
19.7.7 Tipicne greske sa decalima
-
Decal se "isteze" na kosim povrsinama -- Decal se projektuje duz jedne ose, pa na kosim povrsinama tekstura postaje istegnuta. Resenje: Postavi decal da gleda normalno na povrsinu, ne uvek duz jedne ose.
-
Decal se vidi na pogresnom meshu -- Box volume decala obuhvata vise mesheva. Resenje: Smanji box ili koristi
Receives Decals = falsena meshevima koji ne bi trebalo da primaju decale. -
Z-fighting -- Decal "treperi" jer je preblizu povrsini. Resenje: Koristi bias podesavanja u decal materijalu.
-
Decal ne radi na Nanite meshu -- Proveeri da koristis DBuffer decal mode i da je DBuffer omogucen u projektu.
19.8 Kombinovanje tehnika -- prakticni primeri
19.8.1 Primer: Kameni zid sa mahovinom
Ovaj primer kombinuje skoro sve tehnike iz ovog poglavlja:
-
Bazni materijal kamena:
- Albedo, Normal, Roughness, Height mape za kamen
- Detail normal map za mikro-teksturu povrsine kamena
- Triplanar mapping jer je kamen organski oblik bez dobrih UV-a
-
Materijal mahovine:
- Albedo, Normal, Roughness, Height mape za mahovinu
- Detail textures za pojedinacne travke mahovine
-
Height-based blending izmedju kamena i mahovine:
- Vertex color kao makro mask
- Height mape za realistican prelaz
- World normal bias -- mahovina preferira povrsine koje gledaju nagore
-
POM za malter izmedju kamenih blokova:
- Daje utisak dubine izmedju blokova bez dodatne geometrije
-
Decali za dodatni detalj:
- Pukotine u kamenu
- Fleke vlage
19.8.2 Primer: Sci-fi pod sa ostecenjima
-
Bazni materijal metalnog poda:
- Tileable teksture sa PBR parametrima
- Detail normal map za sitnu metalnu teksturu
- POM za udubljena polja na podu
-
Osteceni materijal:
- Ogrebotine i ostecenja kao drugi sloj
- Height-based blending -- ostecenja se pojavljuju na ivicama i uzvissenjima
-
Decali za specificna ostecenja:
- Rupe od metaka
- Tragovi paljevine
- Fleke ulja i tekucina
-
Displacement na ivicama:
- Gde se pod spojio sa zidom, displacement daje uverljivu deformaciju
19.9 Optimizacija i best practices
19.9.1 Texture memory management
Svaka tehnika u ovom poglavlju dodaje texture sample-ove, a svaki sample koristi memoriju i bandwidth:
| Tehnika | Dodatni sample-ovi | Memorijski impact |
|---|---|---|
| Normal Map | 1 (vec standardno) | Nizak |
| Detail Textures | 2-4 (albedo + normal) | Srednji |
| POM | 8-64 (ray march) | Visok (ali ista tekstura) |
| Height Blending | 2x sve teksture | Visok |
| Triplanar | 3x sve teksture | Veoma visok |
19.9.2 Prakticna pravila
-
Texture streaming: UE5 automatski stream-uje teksture na osnovu vidljivosti. Ali prevelik broj unikatnih tekstura moze izazvati "texture pop-in". Koristi tileable teksture gde god mozes.
-
Channel packing: Pakuj grayscale teksture u kanale jedne RGB(A) teksture:
- R: Metallic
- G: Roughness
- B: Ambient Occlusion
- A: Height
Ovo smanjuje broj texture sample-ova i memoriju.
-
Material Instances: Uvek koristi Material Instances umesto dupliranja materijala. Base material definise logiku, instance definise parametre (teksture, boje, scale-ove).
-
Quality switches: Koristi
Quality Switchcvor u materijalu da pruzis razlicite nivoe kvaliteta:- High: POM + detail textures + height blending
- Medium: Normal maps + detail textures + lerp blending
- Low: Normal maps samo
-
Distance-based complexity: Smanjuj kompleksnost materijala na osnovu udaljenosti:
- Blizu: Puna kompleksnost
- Srednja udaljenost: Bez POM, bez detail textures
- Daleko: Samo bazne teksture
19.9.3 Debugging
Kada materijal ne izgleda kako ocekujes:
-
Buffer Visualization (u UE5 Viewport > Buffer Visualization):
- World Normal -- proveri da li su normale ispravne
- Base Color -- da li je boja kako treba
- Roughness -- da li je roughness pravilan
-
Shader Complexity view mode:
- Zeleno = jeftino
- Crveno = skupo
- Belo = preskupo (previse texture sample-ova ili instrukcija)
-
Statistics panel:
- Material Editor > Stats -- prikazuje broj instrukcija i texture sample-ova
- Cilj: Ispod 200 instrukcija za vecinu materijala
19.10 Kljucni pojmovi
| Termin | Objasnjenje |
|---|---|
| Normal Map | RGB tekstura koja kodira pravce normala za simulaciju detalja povrsine bez dodatne geometrije |
| Tangent Space | Lokalni koordinatni sistem na povrsini mesha definisan T, B, N vektorima |
| World Space Normals | Normale kodirane u globalnom koordinatnom sistemu scene |
| TBN Matrix | Matrica 3x3 koja transformise normale izmedju tangent space-a i world space-a |
| Baking | Proces prenosenja detalja sa high-poly na low-poly mesh u formi teksture |
| MikkTSpace | Standard za racunanje tangent basis-a, koriscen u UE5 |
| BC5 | Blok kompresioni format optimizovan za normal mape (dva nezavisna kanala) |
| RNM (Reoriented Normal Mapping) | Tehnika za fizicki korektno blendovanje dve normal mape |
| Parallax Mapping | Tehnika koja pomera UV koordinate na osnovu height mape i ugla posmatranja |
| POM (Parallax Occlusion Mapping) | Napredna parallax tehnika sa ray marching-om kroz height field |
| Self-shadowing | Sposobnost POM-a da simulira senke koje visi delovi bacaju na nize |
| Pixel Depth Offset | Korekcija Z-buffer dubine za pravilnu intersekciju POM povrsina |
| Displacement Mapping | Tehnika koja zaista pomera vertekse mesha na osnovu height mape |
| Nanite Displacement | UE5 sistem koji kombinuje Nanite teselaciju sa displacement mapping-om |
| Detail Textures | Visoko-frekventne teksture koje se tile-uju iznad baznih za poboljsanje blizine |
| Overlay Blending | Metoda mesanja boja gde svetle oblasti postaju svetlije a tamne tamnije |
| Height-Based Blending | Tehnika blendovanja koja koristi height mape za realisticne prelaze izmedju materijala |
| Blend Sharpness | Parametar koji kontrolise ostrinu prelaza u height-based blendingu |
| Triplanar Mapping | Projekcija teksture sa tri ose, ne zahteva UV koordinate |
| Deferred Decals | Decali koji se renderuju tokom deferred pass-a modifikujuci G-buffer |
| DBuffer Decals | Napredniji decal sistem koji radi pre base pass-a i kompatibilan je sa Nanite-om |
| Vertex Color Painting | Rucno "farbanje" vertex boja na meshu za kontrolu blendovanja |
| Channel Packing | Pakovanje vise grayscale tekstura u kanale jedne RGBA teksture za ustedu |
| Cage Mesh | "Naduvana" verzija low-poly mesha koja definise opseg za baking ray casting |
| Texture Streaming | UE5 sistem koji automatski ucitava i uklanja mip nivoe tekstura |
| Material Instance | Instanca baznog materijala sa razlicitim parametrima bez dupliranja logike |
19.11 Dodatno citanje i resursi
Zvanicna dokumentacija
- UE5 Materials Documentation -- docs.unrealengine.com/5.0/en-US/unreal-engine-materials/ -- Kompletna referenca za materijale u UE5
- UE5 Decals Overview -- docs.unrealengine.com/5.0/en-US/decals-overview/ -- Zvanicni vodic za decale
Naucni radovi i clanci
- Mikkelsen, M. (2010) -- "Simulation of Wrinkled Surfaces Revisited" -- Originalni rad o MikkTSpace tangent basis-u
- Barre-Brisebois, C. & Hill, S. (2012) -- "Blending in Detail" -- Rad o Reoriented Normal Mapping tehnici
- Szirmay-Kalos, L. & Umenhoffer, T. (2008) -- "Displacement Mapping on the GPU - State of the Art" -- Pregled displacement tehnika
- Tatarchuk, N. (2006) -- "Dynamic Parallax Occlusion Mapping with Approximate Soft Shadows" -- Originalni POM rad sa self-shadowing-om
Tutoriali i kursevi
- Ben Cloward's Shader Tutorials (YouTube) -- Odlicna serija o shader tehnikama u UE5 sa vizuelnim objasnjenjima
- UnrealCG (YouTube) -- Kanaal sa prakticnim tutorijalima za UE5 materijale
- Substance 3D Documentation -- Za baking workflow-ove i kreiranje PBR tekstura
Knjige
- "Real-Time Rendering, 4th Edition" (Akenine-Moller, Haines, Hoffman) -- Poglavlja o texture mapping tehnikama su izuzetno detaljna
- "GPU Gems 3" (Nguyen, ed.) -- Sadrzi odlicne clanke o POM i displacement mapping-u
- "Physically Based Rendering: From Theory to Implementation" (Pharr, Jakob, Humphreys) -- Za dublje razumevanje rendering matematike
Povezana poglavlja u ovoj knjizi
- Poglavlje 03: Normale i tangent space -- Fundamentalne osnove za razumevanje normal mapping-a
- Poglavlje 04: UV koordinate i unwrapping -- Kako UV-i rade i zasto su vazni za sve tehnike u ovom poglavlju
- Poglavlje 05: Teksture -- formati, rezolucija, kompresija -- Osnove tekstura, ukljucujuci kompresione formate poput BC5
- Poglavlje 11: Physically Based Rendering u UE5 -- Kako PBR materijali koriste sve ove tehnike zajedno
Rezime poglavlja: Teksturne tehnike su arsenal alata koji ti omogucavaju da lazes, varas, i simuliras -- sve u sluzbi stvaranja uverljivih povrsina. Normal mapping menja osvetljenje, parallax pomera UV-e, displacement pomera geometriju. Detail textures resavaju problem blizine, height blending pravi prirodne prelaze, triplanar zaobilazi UV probleme, a decali dodaju unikatni detalj. Kljuc uspeha je u kombinovanju pravih tehnika za pravu situaciju -- i u znanju kada je "dovoljno dobro" zaista dovoljno. U sledecem poglavlju prelazimo na dinamicke materijale i parameterizaciju -- kako da tvoji materijali zive, disu, i reaguju na svet oko sebe.