Du har förmodligen gått in i terräng där de klippiga sidorna av en klippa har sin textur sträckt så mycket att det ser orealistiskt ut. Kanske har du en procedurgenererad värld som du inte har någon möjlighet att UV-omslag och textur. Tri-plan kartläggning ger en elegant teknik för att lösa dessa problem och ger dig realistiska texturer från vinkel eller i någon komplicerad form. Här kommer du att lära dig om tekniken, se koden och titta på några av fördelarna, nackdelarna och andra möjligheter när du använder tri-plan kartläggning.
relaterade inläggDet vanligaste problemet är sträckta strukturer, i synnerhet när det gäller terräng. Problemet ligger i UV-koordinaterna för objektet du texturerar. Vid terräng sprids UV-koordinaterna i ett rutnät, jämnt fördelat i X-Y-planet som så:
Denna UV-layout tar inte hänsyn till höjdskillnaden i terrängen och orsakar sträckning. Du kan vidta åtgärder för att utjämna området för de branta polygonerna genom att försiktigt ta bort UV-koordinaterna, men det leder till ett mindre än perfekt resultat. Du har fortfarande warped texturer och vissa plattor, som mitten, komprimeras.
Du kan också vara i en position där du inte kan ta bort UV-koordinaterna för nätet: terrängen eller formen kan genereras procedurellt. Kanske har du ett grottsystem eller hål i din form.
Vi kan lösa dessa problem med den tri-plana kartläggningstekniken (även känd som "tri-planar texturering".
Låt oss först titta på terrängen igen med tri-plannar-kartläggning som tillämpas på det:
Nu är det mycket trevligare! Sträckningen är borta och de branta sluttningarna ser mer realistiska ut.
Tri-plan kartläggning gör detta genom att göra strukturen 3 gånger, i 3 olika riktningar: X, Y och Z axlar. Bild en ruta. Först projiceras texturen ner från den positiva X-axeln mot den negativa X-axeln. Eventuella fragment (pixlar av geometrin) som vetter mot X-axelns riktning, får texturen applicerad på dem. Samma process tillämpas på Y-axeln och Z-axeln.
Dessa renderingar blandas ihop. Så ett fragment som vetter mot hälften på X-axeln och hälften på Z-axeln tar halva X-axeln och halvdelen av Z-axeln. Om fragmentet står inför 90% mot X-axeln istället får den 90% av X-axeln och endast 10% av Z-axeln. Det är som att ta 3 sprayburkar och spruta från toppen, sidan och framsidan.
Allt detta görs i fragmentskärmen av ditt material. Det strukturerar väsentligen geometrin 3 gånger, en gång i varje riktning och blandar sedan resultatet.
Tri-plan kartläggning använder inte alls UV-koordinater. Istället använder den faktiska världskoordinater. Genom att veta detta kan vi titta på koden.
Den första delen att beräkna blandningsfaktorn för varje riktning:
// i wNorm är världsrymden normal för fragmentet vec3 blandning = abs (wNorm); blandning = normalisera (max (blandning, 0.00001)); // Kraftvikt till summan till 1,0 float b = (blending.x + blending.y + blending.z); blandning / = vec3 (b, b, b);
Här tar det i fragmentets världsrymd som är normalt (som kommer att normaliseras och varje komponent ligger inom intervallet -1 och 1) och vi gör det till ett absolut värde. Vi bryr oss inte om en normal står inför i -X eller X, bara det är det på X-axeln. Om vi oroade oss för den absoluta riktningen skulle vi måla formen bakifrån, bak, vänster, höger, topp och botten; 3 gånger än vi behöver.
Därefter tvingar vi den att ligga inom intervallet 0 till 1, så vi slutar med en procentuell multiplikator för var och en av axelkomponenterna. Om det normala är vänd uppåt på Y-axeln får vi ett Y-värde på 1 och det blir allt Y-axelmålningen medan de andra axlarna har värden på 0 och får ingen.
Det är den svåra delen. Därefter blandar vi bara de tre blandningsvärdena (x, y, z) med strukturen vid den texturkoordinaten. Kom ihåg att textkoordinaten är i världsrymden:
vec4 xaxis = texture2D (rockTexture, coords.yz); vec4 yaxis = texture2D (rockTexture, coords.xz); vec4 zaxis = texture2D (rockTexture, koords.xy); // blanda resultaten av de 3 plana prognoserna. vec4 tex = xaxis * blending.x + xaxis * blending.y + zaxis * blending.z;
Och där har vi det. "tex" är den slutliga färgen på fragmentet, blandas tre gånger från de 3 axlarna.
Det kan vara mycket praktiskt att applicera en skalfaktor på texturen eftersom du utan tvekan vill skala den:
// i flottörskala 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;
Om du använder triplanär kartläggning och normala kartor, vill du också tillämpa samma procedur på normalerna i fragmentskärningen, så här:
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: Skapa en getTriPlanarBlend () -funktion för att beräkna blandningen för diffusa, normala och speciella texturer.
Det första fallet du kommer att stöta på är prestanda. Fragmenten av geometrin kommer att göras 3 gånger, en gång i varje riktning. Detta innebär att färg- och belysningsberäkningarna (normalerna) kommer att upprepas och sedan blandas. Om du redan är fastsatt för fria ramar kanske du inte vill använda triplanär kartläggning.
Nästa betydande undergång är blandningen i 45 graders vinklar, speciellt där olika texturer överlappar varandra där du använder texturplottning. Du kan utföra 4 fler renders, från vinkeln hörnen, men prestationsfönstret för det kommer förmodligen inte att vara värt det. Du kan försöka blanda med en djupskarta, en teknik som ibland används i texturplottning.
Du borde nu ha en förståelse för hur triformig kartläggning fungerar och vad den kan användas till. Men det har många andra applikationer där det kan ändras något för att ge intressanta resultat.
Som tidigare nämnts är procedur terräng en bra kandidat för tekniken. Grottor, klippor och komplexa lavatunnlar är nu lätta att texturera. Du kan till och med påverka vilken textur som används, baserat på några slumpmässiga eller pseudo-slumpmässiga (brus) rutiner. Höjning eller till och med sluttning kan bestämma vilken textur som används.
Genom att ändra rutinen för att bara projicera en textur från toppen (y-axeln) och kläm fast blandningsvärdet till ett acceptabelt område, dvs. 10%, då kan du göra snö på toppen av allt i scenen. En atomvåning kunde skura allt som strålar ut från en viss världskoordinat ursprungspunkt med samma teknik, men baserar vinkeln från ursprungspunkten och använder en mörkbränna konsistens.
Kommer några andra applikationer att komma i åtanke? Låt oss veta och gärna diskutera.