Sie sind wahrscheinlich in ein Terrain geraten, wo die Textur der steilen Seiten einer Klippe so stark gedehnt ist, dass sie unrealistisch wirkt. Möglicherweise haben Sie eine prozedural erzeugte Welt, in der Sie keine Möglichkeit haben, UV-Abwicklung und Textur zu entwickeln. Tri-Planar-Mapping bietet eine elegante Technik, um diese Probleme zu lösen und realistische Texturen aus jedem Winkel oder einer komplexen Form zu erzeugen. Hier erfahren Sie etwas über die Technik, sehen den Code und sehen einige Vorteile, Nachteile und andere Möglichkeiten bei der Verwendung von Tri-Planar-Mapping.
zusammenhängende PostsDas häufigste Problem sind gestreckte Texturen, insbesondere in Bezug auf das Gelände. Das Problem liegt in den UV-Koordinaten des Objekts, das Sie strukturieren. Im Fall von Gelände sind die UV-Koordinaten in einem Raster verteilt, das in der X-Y-Ebene gleichmäßig verteilt ist:
Dieses UV-Layout berücksichtigt nicht den Höhenunterschied im Gelände und verursacht Dehnungen. Sie können Maßnahmen ergreifen, um den Bereich für die steilen Polygone auszugleichen, indem Sie die UV-Koordinaten vorsichtig auspacken. Dies führt jedoch zu einem nicht idealen Ergebnis. Sie haben immer noch verzogene Texturen und einige Kacheln, beispielsweise die mittlere, werden komprimiert.
Möglicherweise befinden Sie sich auch an einer Position, an der Sie die UV-Koordinaten des Netzes nicht auspacken können: Das Gelände oder die Form könnten prozedural generiert werden. Vielleicht haben Sie ein Höhlensystem oder Löcher in Ihrer Form.
Wir können diese Probleme mit der Tri-Planar-Mapping-Technik (auch als "Tri-Planar-Texturierung" bezeichnet) lösen..
Lassen Sie uns zunächst das Gelände mit der angewendeten Tri-Plannar-Zuordnung erneut betrachten:
Das ist jetzt viel schöner! Die Dehnung ist vorbei und die steilen Hänge wirken realistischer.
Bei der Tri-Planar-Abbildung wird die Textur dreimal in drei verschiedenen Richtungen dargestellt: X-, Y- und Z-Achse. Bild eine Box Zuerst wird die Textur von der positiven X-Achse in Richtung der negativen X-Achse nach unten projiziert. Bei Fragmenten (Pixel der Geometrie), die in Richtung der X-Achse zeigen, wird die Textur auf sie angewendet. Der gleiche Vorgang wird auf die Y-Achse und die Z-Achse angewendet.
Diese Renderings werden miteinander vermischt. Ein Fragment, das zur Hälfte auf der X-Achse und zur Hälfte auf der Z-Achse steht, nimmt also die Hälfte der X-Achse und die Hälfte der Z-Achse. Wenn das Fragment stattdessen zu 90% in Richtung der X-Achse zeigt, erhält es 90% der Wiedergabe der X-Achse und nur 10% der Z-Achse. Es ist wie 3 Sprühdosen zu nehmen und von oben, von der Seite und von vorne zu sprühen.
All dies geschieht im Fragment-Shader Ihres Materials. Es texturiert die Geometrie im Wesentlichen dreimal, einmal in jede Richtung, und mischt dann das Ergebnis.
Tri-Planar-Mapping verwendet überhaupt keine UV-Koordinaten. Stattdessen werden tatsächliche Weltkoordinaten verwendet. Wenn wir das wissen, schauen wir uns den Code an.
Der erste Teil ist die Berechnung des Mischungsfaktors für jede Richtung:
// in wNorm ist die Weltraumnormale des Fragments vec3 blending = abs (wNorm); mischen = normalisieren (max (mischen, 0,00001)); // Erzwinge Gewichtungen auf 1,0 Float b = (Mischung.x + Mischung.y + Mischung.z); Mischen / = vec3 (b, b, b);
Hier nimmt man die Weltraumnormale des Fragments (die normalisiert wird und jede Komponente im Bereich von -1 und 1 liegt) und wir machen es zu einem absoluten Wert. Es ist uns egal, ob ein Normal in -X oder X zeigt, nur auf der X-Achse. Wenn wir uns Sorgen um die absolute Richtung machen, malen wir die Form von vorne, hinten, links, rechts, oben und unten. 3 mal mehr als wir brauchen.
Als Nächstes zwingen wir, es innerhalb des Bereichs von 0 bis 1 zu halten, sodass wir für jede der Achskomponenten einen prozentualen Multiplikator erhalten. Wenn die Normalen auf der Y-Achse nach oben zeigen, erhalten wir einen Y-Wert von 1 und alle Y-Achsen werden gezeichnet, während die anderen Achsen 0 und keine haben.
Das ist der schwierige Teil. Als Nächstes mischen wir einfach die drei Mischwerte (x, y, z) mit der Textur an dieser Texturkoordinate. Denken Sie daran, dass die Texturkoordinate im Weltraum liegt:
vec4 xaxis = texture2D (rockTexture, coords.yz); vec4 yaxis = texture2D (rockTexture, coords.xz); vec4 zaxis = texture2D (rockTexture, coords.xy); // mischen Sie die Ergebnisse der 3 planaren Projektionen. vec4 tex = xaxis * blending.x + xaxis * blending.y + zaxis * blending.z;
Und da haben wir es. "tex" ist die Endfarbe des Fragments, dreimal aus den drei Achsen gemischt.
Es kann sehr praktisch sein, einen Skalierungsfaktor auf die Textur anzuwenden, da Sie sie zweifellos skalieren möchten:
// in Float-Skala vec4 xaxis = texture2D (rockTexture, coords.yz * scale); 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;
Wenn Sie Tri-Planar-Mapping und normale Karten verwenden, sollten Sie dasselbe Verfahren auf die Normalen im Fragment-Shader anwenden, wie dies z.
vec4 xaxis = texture2D (rockNormalTexture, coords.yz * scale); vec4 yaxis = texture2D (rockNormalTexture, coords.xz * scale); vec4 zaxis = texture2D (rockNormalTexture, coords.xy * scale); vec4 tex = xaxis * blending.x + xaxis * blending.y + zaxis * blending.z;SPITZE: Erstellen Sie eine getTriPlanarBlend () - Funktion, um die Mischung für diffuse, normale und spiegelnde Texturen zu berechnen.
Der erste Sturz, dem Sie begegnen werden, ist die Leistung. Die Fragmente der Geometrie werden dreimal in jede Richtung gerendert. Dies bedeutet, dass die Farb- und Beleuchtungsberechnungen (Normalen) wiederholt und dann gemischt werden. Wenn Sie bereits für freie Frames gebunden sind, möchten Sie möglicherweise keine Tri-Planar-Zuordnung verwenden.
Der nächste bedeutende Sturz ist das Verschmelzen in 45-Grad-Winkeln, insbesondere wenn verschiedene Texturen sich überschneiden, wenn Sie die Texturaufteilung verwenden. Sie könnten 4 weitere Renderings aus den Winkelecken ausführen, aber der Performance-Hit dafür wird sich wahrscheinlich nicht lohnen. Sie können auch versuchen, mit einer Tiefenkarte zu mischen, einer Technik, die manchmal bei der Texturaufteilung verwendet wird.
Sie sollten jetzt wissen, wie die dreiplanare Abbildung funktioniert und wofür sie verwendet werden kann. Es gibt jedoch viele andere Anwendungen, bei denen es leicht geändert werden kann, um interessante Ergebnisse zu erzielen.
Wie bereits erwähnt, ist prozedurales Gelände ein guter Kandidat für die Technik. Höhlen, Klippen und komplexe Lavatunnel sind jetzt leicht zu strukturieren. Sie könnten sogar beeinflussen, welche Textur wo verwendet wird, basierend auf zufälligen oder Pseudo-Zufallsroutinen (Rauschen). Höhe oder sogar Neigung könnten bestimmen, welche Textur verwendet wird.
Durch Modifizieren der Routine, um nur eine Textur von oben (y-Achse) zu projizieren und den Mischwert fest auf einen akzeptablen Bereich zu klemmen, d. H. 10%, dann könnten Sie Schnee auf den Dächern der Szene rendern. Eine Atombombe könnte alles verbrennen, das von einem bestimmten Weltkoordinaten-Ursprungspunkt ausgestrahlt wird, wobei dieselbe Technik verwendet wird, der Winkel jedoch vom Ursprungspunkt abhängt und eine dunkle Brennstruktur verwendet wird.
Denken Sie an andere Anwendungen? Lassen Sie uns wissen und fühlen Sie sich frei zu diskutieren.