Probabilmente hai incontrato un terreno in cui i lati ripidi di una scogliera hanno la loro trama tesa così tanto da sembrare irrealistica. Forse hai un mondo generato proceduralmente che non hai modo di scartare e tessere UV. La mappatura trilaterale fornisce una tecnica elegante per risolvere questi problemi e fornire trame realistiche da qualsiasi angolazione o da qualsiasi forma complessa. Qui scoprirai la tecnica, vedrai il codice e osserverai alcuni dei vantaggi, svantaggi e altre possibilità quando usi la mappatura trilaterale.
Post correlatiIl problema più comune sono le texture allungate, in particolare quando si tratta di terreno. Il problema sta nelle coordinate UV dell'oggetto che stai truccando. Nel caso del terreno, le coordinate UV sono distribuite in una griglia, distanziate uniformemente nel piano X-Y in questo modo:
Questo layout UV non tiene conto della differenza di altezza nel terreno e causa lo stretching. Puoi prendere delle misure per uniformare l'area per i poligoni ripidi, scartando con cura le coordinate UV, ma ciò porta a un risultato non ideale. Hai ancora trame deformate e alcune tessere, come quella centrale, sono compresse.
Potresti anche trovarti in una posizione in cui non puoi scartare le coordinate UV della mesh: il terreno o la forma potrebbero essere generati proceduralmente. Forse hai un sistema di caverne o buchi nella tua forma.
Siamo in grado di risolvere questi problemi con la tecnica di mappatura trilineare (nota anche come "tridimensionalità tridimensionale").
Per prima cosa, guardiamo di nuovo il terreno con una mappatura trilaterale applicata ad esso:
Ora è molto più bello! Lo stretching è finito e le pendenze ripide sembrano più realistiche.
La mappatura trilineare lo fa rendendo la texture 3 volte, in 3 direzioni diverse: X, Y e Z. Immagina una scatola. Prima la texture viene proiettata dall'asse X positivo verso l'asse X negativo. Eventuali frammenti (pixel della geometria) rivolti nella direzione dell'asse X ottengono la trama applicata a loro. Lo stesso processo viene applicato all'asse Y e all'asse Z..
Questi rendering sono mescolati insieme. Quindi un frammento che si trova a metà dell'asse X e metà sull'asse Z eseguirà metà del rendering dell'asse X e metà del rendering dell'asse Z. Se invece il frammento si trova di fronte al 90% verso l'asse X, riceve il 90% del rendering dell'asse X e solo il 10% dell'asse Z. È come prendere 3 bombolette spray e spruzzare dall'alto, dal lato e dal davanti.
Tutto questo è fatto nello shader dei frammenti del tuo materiale. Tratta essenzialmente la geometria 3 volte, una volta in ciascuna direzione e quindi fonde il risultato.
La mappatura trilaterale non utilizza affatto le coordinate UV. Invece usa le coordinate reali del mondo. Sapendo questo, diamo un'occhiata al codice.
La prima parte per calcolare il fattore di fusione per ogni direzione:
// in wNorm è lo spazio del mondo normale del frammento vec3 blending = abs (wNorm); blending = normalize (max (blending, 0.00001)); // Forza pesi per sommare a 1.0 float b = (blending.x + blending.y + blending.z); miscelazione di / = vec3 (b, b, b);
Qui prende lo spazio del mondo normale del frammento (che sarà normalizzato e ogni componente sarà compreso tra -1 e 1) e lo renderemo un valore assoluto. Non ci importa se una normale è rivolta in -X o X, è proprio sull'asse X. Se ci preoccupassimo della direzione assoluta, dipingevamo la forma dalla parte anteriore, posteriore, sinistra, destra, superiore e inferiore; 3 volte in più del necessario.
Quindi lo forziamo ad essere nell'intervallo da 0 a 1, quindi finiamo con un moltiplicatore di percentuale per ciascuno dei componenti dell'asse. Se la normale è rivolta verso l'alto sull'asse Y, otteniamo un valore Y pari a 1 e ottiene tutto il dipinto dell'asse Y mentre gli altri assi avranno valori pari a 0 e non ne ottengono.
Questa è la parte difficile. Quindi basta mescolare i tre valori di fusione (x, y, z) con la trama a quella coordinata della trama. Ricorda, la coordinata della trama è nello spazio del mondo:
vec4 xaxis = texture2D (rockTexture, coords.yz); vec4 yaxis = texture2D (rockTexture, coords.xz); vec4 zaxis = texture2D (rockTexture, coords.xy); // miscela i risultati delle 3 proiezioni planari. vec4 tex = xaxis * blending.x + xaxis * blending.y + zaxis * blending.z;
E lì ce l'abbiamo. "tex" è il colore finale del frammento, miscelato tre volte dai 3 assi.
Può essere molto utile applicare un fattore di scala alla trama, poiché senza dubbio si vorrà ridimensionarla:
// in scala mobile vec4 xaxis = texture2D (scala rockTexture, coords.yz *); vec4 yaxis = texture2D (rockTexture, coords.xz * scale); vec4 zaxis = texture2D (rockTexture, coords.xy * scale); vec4 tex = xaxis * blending.x + xaxis * blending.y + zaxis * blending.z;
Se si utilizza la mappatura trilinea e le mappe normali, si vorrà anche applicare la stessa procedura alle normali nello shader di frammenti, in questo modo:
vec4 xaxis = texture2D (rockNormalTexture, scala coords.yz *); vec4 yaxis = texture2D (rockNormalTexture, scala coords.xz *); vec4 zaxis = texture2D (rockNormalTexture, coords.xy * scale); vec4 tex = xaxis * blending.x + xaxis * blending.y + zaxis * blending.z;MANCIA: Creare una funzione getTriPlanarBlend () per calcolare la fusione per trame diffuse, normali e speculari.
La prima caduta che incontrerai è la performance. I frammenti della geometria saranno resi 3 volte, una volta in ciascuna direzione. Ciò significa che i calcoli del colore e dell'illuminazione (normali) saranno ripetuti e quindi miscelati. Se sei già legato per fotogrammi gratuiti, potresti non voler utilizzare la mappatura trilaterale.
La successiva caduta significativa è la fusione con angoli di 45 gradi, in particolare dove le diverse trame si sovrappongono a quelle in cui si utilizza lo splatting della trama. Potresti eseguire altri 4 rendering, dagli angoli degli angoli, ma il risultato in termini di prestazioni probabilmente non ne varrebbe la pena. Potresti provare a fondere con una mappa di profondità, una tecnica a volte utilizzata nello splatting delle texture.
Ora dovresti avere una comprensione di come funziona la mappatura trilaterale e di cosa può essere usata. Ma ha molte altre applicazioni in cui può essere leggermente modificato per produrre risultati interessanti.
Come accennato prima, il terreno procedurale è un buon candidato per la tecnica. Grotte, scogliere e complessi tunnel di lava sono ora facili da tessere. Potresti anche influenzare quale texture è usata dove basata su alcune routine casuali, o pseudo-casuali (rumore). L'elevazione o anche la pendenza potrebbero determinare quale texture viene utilizzata.
Modificando la routine per proiettare semplicemente una trama dall'alto (asse y) e bloccando saldamente il valore della miscela su un intervallo accettabile, ad es. 10%, quindi potresti rendere la neve sulle cime di tutto nella scena. Un'esplosione atomica potrebbe bruciare tutto ciò che si irradia da un certo punto di origine di coordinate mondiali usando la stessa tecnica, ma basando l'angolo dal punto di origine e usando una trama di bruciatura scura.
Ti vengono in mente altre applicazioni? Fateci sapere e sentitevi liberi di discutere.