Probabil ați alergat într-un teren în care laturile abrupte ale unei stânci au textura lor întinsă atât de mult încât pare nerealistă. Poate că aveți o lume generată de procedură, că nu aveți nici o cale de a vă desprinde și de a crea textura. Cartografia tri-plană oferă o tehnică elegantă pentru a rezolva aceste probleme și pentru a vă oferi texturi realiste din orice unghi sau în orice formă complexă. Aici veți afla despre tehnică, vedeți codul și uitați-vă la unele dintre avantajele, dezavantajele și alte posibilități atunci când utilizați cartografierea tri-plană.
postări asemănatoareProblema cea mai frecventă este textura întinsă, în special în ceea ce privește terenul. Problema constă în coordonatele UV ale obiectului pe care îl texturăți. În cazul terenului, coordonatele UV sunt întinse într-o grilă, distanțate uniform în planul X-Y astfel:
Acest aspect UV nu ia în considerare diferența de înălțime în teren și cauzează întinderea. Puteți lua măsuri pentru a uniformiza zona pentru poligoanele abrupte prin desigilarea cu atenție a coordonatelor UV, dar care duce la un rezultat mai mic decât ideal. Încă mai ai răsucite texturile și unele plăci, cum ar fi una centrală, sunt comprimate.
S-ar putea să fiți și în situația în care nu puteți dezlipi coordonatele UV ale rețelei: terenul sau forma ar putea fi generate în mod procedural. Poate că aveți un sistem de peșteri sau găuri în forma voastră.
Putem rezolva aceste probleme cu ajutorul tehnicii tri-plane de cartografiere (cunoscută și ca "texturarea tri-plană".
În primul rând, permiteți să vă uitați din nou la teren cu ajutorul unei mapări tri planare:
Acum, că este mult mai frumos! Întinderea a dispărut, iar pantele abrupte arătau mai realiste.
Cartografia tri-plană face acest lucru prin redarea texturii de 3 ori, în 3 direcții diferite: axele X, Y și Z. Imaginează o cutie. Mai întâi textura este proiectată în jos de la axa pozitivă X spre axa negativă X. Orice fragmente (pixeli ai geometriei) care se îndreaptă în direcția axei X obțin textura aplicată acestora. Același proces este aplicat axei Y și axei Z.
Aceste randări sunt amestecate. Deci, un fragment care se confruntă cu jumătate pe axa X și jumătate pe axa Z va lua jumătate din redarea axei X și jumătate din redarea axei Z. Dacă fragmentul se confruntă cu 90% față de axa X, atunci acesta primește 90% din redarea axei X și numai 10% din axa Z. Este ca și cum ai lua 3 cutii de pulverizare și pulverizați din partea superioară, laterală și din față.
Toate acestea se fac în shader-ul fragmentului materialului tău. Se conturează, în esență, geometria de 3 ori, o dată în fiecare direcție și apoi se amestecă rezultatul.
Cartografia tri-plană nu utilizează deloc coordonatele UV. În schimb, utilizează coordonatele lumii reale. Știind asta, lasă-te să privi codul.
Prima parte pentru a calcula factorul de amestec pentru fiecare direcție:
// în wNorm este spațiul mondial normal al fragmentului vec3 blending = abs (wNorm); amestecare = normalizare (max (amestecare, 0.00001)); // Greutățile forței la suma la 1.0 float b = (blending.x + blending.y + blending.z); amestecarea / = vec3 (b, b, b);
Aici este nevoie de spațiul cosmic normal al fragmentului (care va fi normalizat și fiecare component va fi în intervalul de -1 și 1) și îl vom face o valoare absolută. Nu ne pasă dacă un normal se confruntă în -X sau X, tocmai pe axa X. Dacă ne-am face griji în privința direcției absolute, vom picta forma din față, spate, stânga, dreapta, sus și jos; 3 ori mai mult decât avem nevoie.
Apoi îl forțăm să fie în intervalul de la 0 la 1, astfel încât ajungem cu un procent multiplicator pentru fiecare dintre componentele axei. În cazul în care normalul este orientat în sus pe axa Y, obținem o valoare Y de 1 și ajunge la toate picturile axei Y, în timp ce celelalte axe vor avea valori de 0 și nu obțin.
Aceasta este partea dificilă. Apoi vom amesteca doar cele trei valori de amestec (x, y, z) cu textura la acea coordonate de textura. Amintiți-vă că coordonatele texturii se află în spațiul mondial:
vec4 xaxis = textură2D (rockTexture, coords.yz); vec4 yaxis = textură2D (rockTexture, coords.xz); vec4 zaxis = textura2D (rockTexture, coords.xy); // combină rezultatele celor 3 proiecții planare. vec4 tex = xaxis * amestecarea.x + xaxis * blending.y + zaxis * blending.z;
Și acolo o avem. "tex" este culoarea finală a fragmentului, amestecată de trei ori din cele 3 axe.
Acesta poate fi foarte util pentru a aplica un factor de scalare pe textura, pe măsură ce, fără îndoială, doriți să-l scalați:
// în scară float vec4 xaxis = texture2D (scara rockTexture, coords.yz *); vec4 yaxis = textură2D (scara rockTexture, coords.xz *); vec4 zaxis = textură2D (scara rockTexture, coords.xy *); vec4 tex = xaxis * amestecarea.x + xaxis * blending.y + zaxis * blending.z;
Dacă utilizați hărți tri-planare și hărți normale, veți dori, de asemenea, să aplicați aceeași procedură normalelor în shader-ul fragmentului, după cum urmează:
vec4 xaxis = textură2D (scara rockNormalTexture, coords.yz *); vec4 yaxis = textură2D (scara rockNormalTexture, coords.xz *); vec4 zaxis = textură2D (scara rockNormalTexture, coords.xy *); vec4 tex = xaxis * amestecarea.x + xaxis * blending.y + zaxis * blending.z;BACSIS: Creați o funcție getTriPlanarBlend () pentru a calcula amestecul pentru texturi difuze, normale și speculare.
Prima cădere pe care o veți întâlni este performanța. Fragmentele geometriei vor fi redate de 3 ori, o dată în fiecare direcție. Aceasta înseamnă că culorile și calculele de iluminare (normale) vor fi repetate și apoi amestecate. Dacă sunteți deja legat de cadre libere, este posibil să nu doriți să utilizați cartografiere tri-plană.
Următoarea scădere semnificativă este amestecarea la unghiuri de 45 de grade, în special în cazul în care texturi diferite se suprapun în cazul în care utilizați splatting textura. Ați putea să efectuați încă 4 redări, din colțul unghiului, dar performanța lovită pentru asta probabil că nu va merita. Ați putea încerca să amestecați cu o hartă de adâncime, o tehnică uneori utilizată în stropirea texturii.
Ar trebui să aveți acum o înțelegere a modului în care funcționează cartografia tri-plană și pentru ce poate fi folosită. Dar are multe alte aplicații în care poate fi schimbată ușor pentru a produce rezultate interesante.
Așa cum am menționat anterior, terenul procedural este un bun candidat pentru această tehnică. Peșterile, stâncile și tunelurile complexe de lavă sunt acum ușor de texturat. Ați putea influența chiar și ce textură este folosită acolo unde se bazează pe anumite rutine aleatorii sau pseudo-aleatoare (zgomot). Elevarea sau chiar panta ar putea determina ce textura este folosita.
Modificând rutina pentru a proiecta doar o textura de sus (axa y) și fixarea fermă a valorii amestecului într-un interval acceptabil, adică. 10%, atunci puteți face zăpadă pe vârfurile a tot ce se petrece în scenă. O explozie atomică ar putea să ardă tot ce radiază dintr-un anumit punct de origine al coordonatelor lumii folosind aceeași tehnică, dar bazându-se pe unghiul de la punctul de origine și folosind o textura întunecată întunecată.
Vă doresc alte aplicații? Spuneți-ne și fiti liberi să discutați.