Je bent waarschijnlijk terrein tegengekomen waar de steile wanden van een klif zoveel textuur hebben dat het er niet realistisch uitziet. Misschien heb je een procedureel gegenereerde wereld die je op geen enkele manier kunt UV-uitpakken en textuur. Tri-planaire mapping biedt een elegante techniek om deze problemen op te lossen en geeft u realistische texturen vanuit elke hoek of op een complexe vorm. Hier leert u meer over de techniek, leest u de code en bekijkt u enkele voordelen, nadelen en andere mogelijkheden bij het gebruik van driedimensionale mapping.
gerelateerde berichtenHet meest voorkomende probleem zijn uitgerekte texturen, met name als het gaat om terrein. Het probleem ligt in de UV-coördinaten van het object dat u textureert. In het geval van terrein worden de UV-coördinaten verdeeld in een raster, gelijkmatig verdeeld in het X-Y-vlak, zoals:
Deze UV-indeling houdt geen rekening met hoogteverschil in het terrein en veroorzaakt rekken. Je kunt maatregelen nemen om het gebied gelijkmatig te maken voor de steile polygonen door de UV-coördinaten zorgvuldig uit te pakken, maar dat levert een minder dan ideaal resultaat op. Je hebt nog steeds kromme texturen en sommige tegels, zoals de middelste, zijn gecomprimeerd.
Mogelijk bevindt u zich ook in een positie waarin u de UV-coördinaten van het net niet kunt uitpakken: het terrein of de vorm kan procedureel worden gegenereerd. Misschien heb je een grottenstelsel of gaten in je vorm.
We kunnen deze problemen oplossen met de tri-planaire mappingtechniek (ook bekend als "tri-planaire texturering").
Laten we eerst het terrein opnieuw bekijken met tri-plannar-toewijzing erop:
Dat is nu veel leuker! Het rekken is verdwenen en de steile hellingen zien er realistischer uit.
Tri-planaire mapping doet dit door de textuur 3 keer te renderen, in 3 verschillende richtingen: X-, Y- en Z-assen. Beeld een doos in. Eerst wordt de textuur naar beneden geprojecteerd vanaf de positieve X-as naar de negatieve X-as. Alle fragmenten (pixels van de geometrie) die in de richting van de X-as wijzen, krijgen de textuur erop. Hetzelfde proces wordt toegepast op de Y-as en de Z-as.
Deze weergaven worden samen gemengd. Een fragment dat de helft op de X-as en de helft op de Z-as ziet, neemt dus de helft van de X-as rendering en de helft van de Z-as rendering. Als het fragment in plaats daarvan voor 90% naar de X-as is gekeerd, ontvangt het 90% van de X-as rendering en slechts 10% van de Z-as. Het is net als het nemen van 3 spuitbussen en sproeien vanaf de bovenkant, de zijkant en de voorkant.
Dit alles gebeurt in de fragmentshader van je materiaal. Het structureert in wezen de geometrie 3 keer, een keer in elke richting en combineert dan het resultaat.
Tri-planaire mapping maakt helemaal geen gebruik van UV-coördinaten. In plaats daarvan gebruikt het werkelijke wereldcoördinaten. Als je dit weet, kun je de code bekijken.
Het eerste deel om de overvloeifactor voor elke richting te berekenen:
// in wNorm is de wereld-ruimtewaarde van het fragment vec3 blending = abs (wNorm); mengen = normaliseren (max (mengen, 0,00001)); // Geforceerde gewichten optellen tot 1,0 float b = (blending.x + blending.y + blending.z); mengen / = vec3 (b, b, b);
Hierin wordt de wereld-ruimtewaarde van het fragment overgenomen (die zal worden genormaliseerd en elke component zal binnen het bereik van -1 en 1 liggen) en we maken er een absolute waarde van. Het maakt ons niet uit of een normaal wordt geconfronteerd in -X of X, alleen dat is het op de X-as. Als we ons zorgen zouden maken over de absolute richting zouden we de vorm schilderen vanaf de voorkant, achterkant, linkerkant, rechterkant, bovenkant en onderkant; Nog 3 keer meer dan we nodig hebben.
Vervolgens dwingen we het binnen het bereik van 0 tot 1 te liggen, zodat we eindigen met een percentage-vermenigvuldiger voor elk van de ascomponenten. Als de normaal op de Y-as naar boven wijst, krijgen we een Y-waarde van 1 en krijgt deze alle Y-as-painting, terwijl de andere assen waarden van 0 hebben en geen Y-as krijgen.
Dat is het moeilijke deel. Vervolgens mengen we de drie overvloeiwaarden (x, y, z) met de textuur op die textuurcoördinaat. Vergeet niet dat de textuurcoördinaat zich in de wereldruimte bevindt:
vec4 xaxis = texture2D (rockTexture, coords.yz); vec4 yaxis = texture2D (rockTexture, coords.xz); vec4 zaxis = texture2D (rockTexture, coords.xy); // meng de resultaten van de 3 planaire projecties. vec4 tex = xaxis * blending.x + xaxis * blending.y + zaxis * blending.z;
En daar hebben we het. "tex" is de uiteindelijke kleur van het fragment, driemaal gemengd uit de 3 assen.
Het kan erg handig zijn om een schaalfactor toe te passen op de textuur, omdat u deze ongetwijfeld wilt schalen:
// in floatschaal vec4 xaxis = texture2D (rockTexture, coords.yz * schaal); vec4 yaxis = texture2D (rockTexture, coords.xz * schaal); vec4 zaxis = texture2D (rockTexture, coords.xy * schaal); vec4 tex = xaxis * blending.x + xaxis * blending.y + zaxis * blending.z;
Als u drievlakken toewijzingen en normale kaarten gebruikt, wilt u dezelfde procedure ook toepassen op de normalen in de fragmentshader, zoals zo:
vec4 xaxis = texture2D (rockNormalTexture, coords.yz * schaal); vec4 yaxis = texture2D (rockNormalTexture, coords.xz * schaal); vec4 zaxis = texture2D (rockNormalTexture, coords.xy * schaal); vec4 tex = xaxis * blending.x + xaxis * blending.y + zaxis * blending.z;TIP: Maak een getTriPlanarBlend () -functie om de overvloeiing voor diffuse, normale en spiegelende texturen te berekenen.
De eerste ondergang die je zult tegenkomen, is de uitvoering. De fragmenten van de geometrie worden driemaal weergegeven, één keer in elke richting. Dit betekent dat de kleur- en belichtingsberekeningen (normalen) worden herhaald en vervolgens worden gemengd. Als u al bent vastgebonden voor gratis frames, wilt u misschien geen tri-planaire mapping gebruiken.
De volgende belangrijke val is het mengen onder hoeken van 45 graden, vooral wanneer verschillende texturen overlappen waar u textuur splatting gebruikt. Je zou nog 4 renders kunnen uitvoeren, vanuit de hoekhoeken, maar de prestatieshit daar is waarschijnlijk niet de moeite waard voor. U kunt proberen te mengen met een dieptekaart, een techniek die soms wordt gebruikt bij splatting met textuur.
U moet nu begrijpen hoe tri-planar mapping werkt en waarvoor het kan worden gebruikt. Maar het heeft vele andere toepassingen waar het enigszins kan worden veranderd om interessante resultaten te produceren.
Zoals eerder vermeld, is procedureel terrein een goede kandidaat voor de techniek. Grotten, kliffen en complexe lavatunnels zijn nu gemakkelijk te structureren. Je zou zelfs kunnen beïnvloeden welke textuur wordt gebruikt op basis van willekeurige, of pseudo-willekeurige (ruis) routines. Hoogte of zelfs helling kan bepalen welke textuur wordt gebruikt.
Door de routine aan te passen om een textuur van de bovenkant (y-as) te projecteren en de mengwaarde stevig vast te klemmen tot een acceptabel bereik, dwz. 10%, dan zou je sneeuw op de toppen van alles in de scène kunnen weergeven. Een atoomontploffing kan alles wat vanuit een bepaald wereldcoördinatenoorsprongspunt uitstraalt met dezelfde techniek verschroeien, maar de hoek van het oorsprongspunt baseren en een donkere brandwondtextuur gebruiken.
Zijn er nog andere toepassingen voor de geest? Laat het ons weten en voel je vrij om te bespreken.