Problemet

Du har sannsynligvis løp inn i terreng hvor de bratte sidene av en klippe har tekstur strukket så mye at det ser ut til å være urealistisk. Kanskje du har en prosessert generert verden som du ikke har mulighet til å UV-pakke og tekstur. Tri-plan kartlegging gir en elegant teknikk for å løse disse problemene og gir deg realistiske teksturer fra alle vinkler eller i kompleks form. Her vil du lære om teknikken, se koden, og se på noen av fordelene, ulemper og andre muligheter når du bruker tri-plan kartlegging.

Relaterte innlegg
  • Forward Rendering vs Utsatt Rendering
  • Koding ødeleggende pixel terreng: Hvordan gjøre alt eksplodere
  • Introduksjon til flislagt kartredigerer: Et flott plattform-agnostisk verktøy for å lage nivåkort

Terreng uten tri-plan kartlegging

Problemet

Det vanligste problemet er strukte teksturer, spesielt når det gjelder terreng. Problemet ligger i UV-koordinatene til objektet du strukturerer. Ved terreng er UV-koordinatene spredt ut i et rutenett, jevnt fordelt i X-Y-planet slik:

Dette UV-opplegget tar ikke hensyn til høydeforskjell i terrenget og forårsaker strekking. Du kan ta tiltak for å jevne ut området for de bratte polygonene ved å forsiktig utpakke UV-koordinatene, men det fører til et mindre enn ideelt resultat. Du har fortsatt warped teksturer og noen fliser, for eksempel midten ett, er komprimert.

Du kan også være i en posisjon der du ikke kan pakke ut UV-koordinatene til nettverket: terrenget eller formen kan bli prosessert generert. Kanskje du har et hulsystem eller hull i form.

Vi kan løse disse problemene med tri-planar kartleggingsteknikken (også kjent som "tri-planar teksturering".

Tri-Planar Kartlegging i detalj

Først må vi se på terrenget igjen med tri-plannar-kartlegging som er brukt på det:


Terreng med tri-plan kartlegging

Nå er det mye bedre! Strekningen er borte og de bratte bakkene ser mer realistiske ut.

Tri-plan kartlegging gjør dette ved å gjøre tekstur tre ganger, i 3 forskjellige retninger: X, Y og Z akser. Bilde en boks. Først projiseres prosessen ned fra den positive X-aksen mot den negative X-aksen. Eventuelle fragmenter (piksler av geometrien) som vender mot X-aksens retning, får teksten påført dem. Den samme prosessen påføres Y-aksen og Z-aksen.

Disse gjengivelsene er blandet sammen. Så et fragment som vender halvveis på X-aksen og halvparten av Z-aksen, vil ta halvparten av X-aksens gjengivelse og halvparten av Z-akse-gjengivelsen. Hvis fragmentet står overfor 90% mot X-aksen i stedet, mottar det 90% av X-aksens gjengivelse og kun 10% av Z-aksen. Det er som å ta 3 sprøytebokser og sprøyte fra toppen, siden og forsiden.


Teksturen projiseres fra 3 vinkler

Alt dette er gjort i fragmentet skyggeren av materialet ditt. Den teksturerer geometrien tre ganger, en gang i hver retning og blander deretter resultatet.

Tri-plan kartlegging bruker ikke UV-koordinater i det hele tatt. I stedet bruker den egentlige verdenskoordinater. Å vite dette, kan vi se på koden.

Den første delen er å beregne blandingsfaktoren for hver retning:

 // i wNorm er verdensrommet normalt for fragmentet vec3 blanding = abs (wNorm); blande = normalisere (maks (blanding, 0.00001)); // Kraftvekter til summen til 1,0 float b = (blending.x + blending.y + blending.z); blanding / = vec3 (b, b, b);

Her tar det i verdensverdien normal av fragmentet (som vil bli normalisert og hver komponent vil ligge innenfor -1 og 1) og vi gjør det til en absolutt verdi. Vi bryr oss ikke om en normal står overfor i -X eller X, bare det er det på X-aksen. Hvis vi bekymret oss for den absolutte retningen, ville vi maler formen fra front, bak, venstre, høyre, topp og bunn; 3 flere ganger enn vi trenger.

Deretter tvinges den til å ligge innenfor området 0 til 1, slik at vi ender med en prosentvis multiplikator for hver av aksjekomponentene. Hvis det normale er vendt oppover på Y-aksen, får vi en Y-verdi på 1 og det blir hele Y-akselmaleringen, mens de andre aksene vil ha verdier på 0 og få ingen.

Det er den harde delen. Deretter blander vi bare de tre blandingsverdiene (x, y, z) med tekstur på den teksturkoordinaten. Husk at teksturkoordinatet er i verdensrommet:

 vec4 xaxis = texture2D (rockTexture, coords.yz); vec4 yaxis = texture2D (rockTexture, koords.xz); vec4 zaxis = texture2D (rockTexture, koords.xy); // bland resultatene av de 3 plane fremskrivningene. vec4 tex = xaxis * blending.x + xaxis * blending.y + zaxis * blending.z;

Og der har vi det. "tex" er den endelige fargen på fragmentet, blandet tre ganger fra de 3 aksene.

Det kan være veldig nyttig å bruke en skalafaktor til tekstur som du vil uten tvil vilje til å skalere den:

 // i float skala vec4 xaxis = texture2D (rockTexture, coords.yz * skala); vec4 yaxis = texture2D (rockTexture, coords.xz * skala); vec4 zaxis = texture2D (rockTexture, koords.xy * skala); vec4 tex = xaxis * blending.x + xaxis * blending.y + zaxis * blending.z;

normaler

Hvis du bruker tri-plan kartlegging og normale kart, vil du også bruke samme fremgangsmåte til normaler i fragment shader, slik som:

 vec4 xaxis = texture2D (rockNormalTexture, coords.yz * skala); vec4 yaxis = texture2D (rockNormalTexture, coords.xz * skala); vec4 zaxis = texture2D (rockNormalTexture, koords.xy * skala); vec4 tex = xaxis * blending.x + xaxis * blending.y + zaxis * blending.z;
TIPS: Lag en getTriPlanarBlend () -funksjon for å beregne blandingen for diffuse, normale og spekulære teksturer.

downfalls

Det første fallet du møter er ytelsen. Geometriens fragmenter skal gjengis 3 ganger, en gang i hver retning. Dette betyr at farge- og belysningsberegningene (normaler) vil gjentas og deretter blandes. Hvis du allerede er festet til gratis rammer, vil du kanskje ikke bruke tri-plan kartlegging.

Den neste signifikante nedgangen er blandingen i 45 grader vinkler, spesielt der forskjellige teksturer overlapper hvor du bruker teksturplotting. Du kan utføre 4 flere gjengivelser, fra vinkelhjørner, men resultatene for det vil sannsynligvis ikke være verdt det. Du kan prøve å blande med et dybdekart, en teknikk som noen ganger brukes i teksturplotting.


Synlige gjennomsiktige overlapper

Konklusjon

Du bør nå ha en forståelse av hvordan tri-plan kartlegging fungerer og hva den kan brukes til. Men det har mange andre applikasjoner der det kan endres litt for å gi interessante resultater.

Som tidligere nevnt er prosessorrengjøring en god kandidat for teknikken. Grotter, klipper og komplekse lavatunneler er nå lette å tekstur. Du kan til og med påvirke hvilken tekstur som brukes der, basert på noen tilfeldige, eller pseudo-tilfeldige (støy) rutiner. Høyde eller skråning kan bestemme hvilken tekstur som brukes.

Ved å endre rutinen for å bare projisere en tekstur fra toppen (y-aksen) og fastspenne blandingsverdien fast til et akseptabelt område, dvs. 10%, så kan du gjøre snø på toppen av alt i scenen. En atomblast kunne skore alt som stråler ut fra et bestemt verdenskoordinat opprinnelsespunkt ved hjelp av samme teknikk, men baserer vinkelen fra opprinnelsespunktet og bruker en mørk brennete tekstur.

Har noen andre programmer kommet til tankene? Gi oss beskjed og gjerne diskutere.