Ideale normale Karten für Unity (und andere Programme)

... und wie Sie herausfinden, was mit Ihrer Pipeline zur Erstellung von Inhalten nicht stimmt.


Angenommen, Sie haben ein erstaunliches High-Poly-Modell, an dem der Künstler gearbeitet hat, und Sie möchten es ins Spiel bringen. Der Künstler zeigte Screenshots des Modells in seinem Programm und sie sehen fantastisch aus. Selbst nach dem Backen normaler Karten für die Low-Poly-Version sieht es immer noch gut aus.


Sehen Sie die Größe dieses traditionellen Modells zum Testen normaler Karten!

Dann bringt die Künstlerin sie ins Spiel und sie sieht ... ein bisschen falsch aus.


Sollten diese Gesichter nicht flach sein?

Die Oberflächen, die flach sein sollten, sind immer noch ein wenig abgerundet, einige sind sogar niedergedrückt, und noch schlimmer, seltsame Streifen verlaufen entlang. Vertraute Situation? Einige von Ihnen sind wahrscheinlich darauf gestoßen, dachten: "Nun, wahrscheinlich wird es nicht besser funktionieren" und gingen weiter. Vielleicht wurde ein wenig Schmutz aufgetragen, um die schwersten Fälle zu maskieren.

Aber mit Ihrer Pipeline zur Erstellung von Inhalten stimmt tatsächlich etwas nicht. Dies ist nicht immer offensichtlich, aber das Problem kann gelöst werden! *

* Wenn Sie davon ausgehen, dass Sie in einigen Fällen Änderungen an der Inhaltspipeline vornehmen können.

Vorwort


In diesem Artikel wird beschrieben, wie Sie ideale normale Karten aus anderen Anwendungen zur Verwendung in Unity 5.3 und höher exportieren. Es geht nicht darum, wie man hochwertige normale Karten erhält. Es gibt viele andere Tutorials dafür, daher werde ich dieses Thema nicht ansprechen.



Tangentenraumbasis


Das Problem ist, wie die normalen Karten des Tangentenraums funktionieren. Wie funktioniert insbesondere der Tangentenraum (oder die Tangentenbasis)? Ich werde nicht zu weit auf die technischen Aspekte ihrer Arbeit eingehen. Ich habe, wie andere Autoren, bereits darüber gesprochen , aber kurz gesagt, der Tangentenraum bestimmt, wie die Ausrichtung der Richtung in der normalen Karte aussehen soll. Welche Richtung auf der normalen Karte ist tatsächlich "vorwärts", "oben" oder "rechts". Grob gesagt ist diese Ausrichtung die Ausrichtung der UV-Koordinaten der Textur und der Normalen der Eckpunkte.

Es ist wichtiger zu verstehen, dass das Programm, das zum Backen der normalen Karte vom Highpoly-Netz zum Lowpoly-Netz verwendet wird, seinen Tangentenraum berechnen mussgenau das gleiche wie das Programm, in dem normale Karten verwendet werden . Da verschiedene Programme den Tangentenraum auf unterschiedliche Weise verwenden können, sind normale gebackene Karten für ein Netz nicht unbedingt für alle Anwendungen gleich. Auch für Anwendungen mit dem gleichen Tangentenraum!

Kenne deinen Feind


Coup aufgrund eines offensichtlichen Fehlers


Der häufigste Fehler ist das Problem „OpenGL vs Direct3D“. Sie werden auch als normale Karten Y + und Y- bezeichnet. Ich habe sie hier nur der Vollständigkeit halber aufgenommen. Höchstwahrscheinlich wissen die meisten Menschen, die auf dieses Problem gestoßen sind, bereits davon oder haben zumindest gelernt, wie man es löst. Da normale Karten in einer Ausrichtung erstellt werden, sind sie für die Verwendung in einer Anwendung, die für die Verwendung einer anderen ausgelegt ist, im Wesentlichen unbrauchbar.


Normale Karten in Direct3D-Ausrichtung in der Unity-Engine, die eine OpenGL-Ausrichtung erwarten.

Dies kann durch die Tatsache verstanden werden, dass die Beleuchtung invertiert zu sein scheint oder von der anderen Seite fällt, jedoch nur in einigen Beleuchtungsrichtungen. Einige Ecken oder Flächen sehen möglicherweise ganz normal aus, bis Sie die Lichtquelle bewegen.

Und mit diesem Problem ist alles klar genug. Die meisten normalen Kartenbackanwendungen verfügen über eine schöne große Schaltfläche oder ein Menü zum Umschalten zwischen OpenGL / Direct3D- oder Y-Ausrichtungsoption. Finden Sie heraus, welche Ausrichtung die Zielanwendung verwendet, und backen Sie darin Karten. Unity verwendet OpenGL und Y +. Unreal verwendet Direct3D und Y-. Dies kann klar verstanden werden, wenn man die Textur der normalen Karte selbst betrachtet. Wenn es so aussieht, als ob sie im grünen Kanal "von oben" leuchten, ist dies die OpenGL-Ausrichtung. Wenn von unten, dann ist dies Direct3D.

Kuriositäten mit sRGB


Ein weiterer häufiger Fehler ist die Verwendung einer als sRGB-Textur gekennzeichneten Textur. Dies ändert die Art und Weise, wie die GPU-Textur abgetastet wird, und zwingt sie, Farbwerte aus dem sRGB-Raum, aus dem normalerweise Farbwerte ausgewählt werden, in einen linearen Farbraum umzuwandeln. Für normale Karten ist dies nicht erforderlich. Wenn Sie den Typ für die Textur in Unity auf "Normale Karte" setzen, deaktiviert die Engine diese Option automatisch. Sie können die Option "sRGB (Farbtextur)" jedoch auch manuell deaktivieren, und die Textur funktioniert wie eine normale Karte. Zumindest in Unity 2017.1 und neuer.


Normale Karte mit aktiviertem Standardtexturtyp und aktiviertem sRGB.

Dieses Problem ist daran zu erkennen, dass normale Karten stark in eine Richtung vorgespannt sind. In diesem Modell sieht fast jedes Gesicht so aus, als ob es auf eine Lichtquelle gerichtet wäre. Dies wird natürlich nicht immer der Fall sein. In einer detaillierteren normalen Karte reagieren alle Teile fast korrekt auf die Beleuchtung, verschieben sich jedoch geringfügig in einen bestimmten Winkel. Manchmal sieht es so aus, als ob die gesamte Oberfläche des Netzes verzerrt ist.

Zu unterschiedlich, um normal zu sein


Ein weiteres häufiges Problem ist die Verwendung verschiedener normaler Backnetze im Spielobjekt. Wie bei Tangenten müssen sie genau übereinstimmen , damit alles funktioniert . Dieser Fehler tritt häufig auf, wenn Künstler Netze mit falschen Scheitelpunktnormalen exportieren. In diesem Fall muss jede Anwendung, die das Netz öffnet, diese selbst berechnen. Es gibt keinen richtigen Weg, um es zu lösen, alles hängt vom Netz ab. Stellen Sie also sicher, dass Sie (oder Künstler) das Modell mit den endgültigen Normalen exportieren!


Normale Karten, die auf einem geglätteten Netz gebacken wurden und wie auf einem Netz mit scharfen Kanten angezeigt werden


Normale Karten, die auf einem Netz mit scharfen Kanten gebacken wurden und wie auf einem geglätteten Netz angezeigt werden

Dies ist ein weiteres Problem, das leicht zu erkennen ist. Wenn das Modell so aussehen soll, als hätte es scharfe Kanten, aber die Schattierung biegt sich von diesen Kanten ab. Dies bedeutet, dass Sie die normale Karte mit glatten Normalen gebacken haben, diese jedoch auf einem Netz mit scharfen Kanten gerendert werden. Wenn sich die Schattierung zum Rand hin biegt, bedeutet dies, dass die Karte mit einer scharfen Kante gebacken und auf einer glatten Kante gerendert wurde. Tatsächlich können in einem Modell beide Fälle vorliegen, da es möglich ist, die Glätte oder Schärfe einzelner Kanten und sogar den Grad der Glätte anzuzeigen. Tatsächlich sind sie jedoch garantiert fehlerhaft, wenn Sie einer anderen Anwendung erlauben, zu erraten, wie sie sein sollte. Das oben dargestellte Modell ist ein Extremfall, und oft ist nicht alles so offensichtlich, da große Teile des Modells möglicherweise völlig normal aussehen. Aber im allgemeinen FallWenn Sie mehrere Kanten haben, die besonders seltsam aussehen, liegt dies wahrscheinlich an einer Nichtübereinstimmung in den Scheitelpunktnormalen.

MikkTSpace gegen Autodesk


Ein weniger auffälliges Problem ist, dass beim Backen von normalen 3ds Max- oder Maya-Karten diese in der Unity-Engine immer falsch sind. Sie werden in Unreal und in fast jedem anderen Programm falsch sein, außer dem, in dem sie gebacken wurden. 3ds Max normale Karten funktionieren in Maya nicht und umgekehrt! Jede dieser Anwendungen berechnet den Tangentenraum auf ihre eigene Weise, die anderen Anwendungen nicht entspricht. Wenn sie unabhängig voneinander verwendet werden, sehen sie perfekt aus . Wenn Sie normale Karten zur Verwendung in diesen Programmen generieren, versuchen Sie, normale Karten darin zu backen. Kaum ein anderes Programm ist in der Lage, die richtigen normalen Karten für diese Anwendungen zu backen, sodass Sie anscheinend keine andere Wahl haben.

Die einzige Lösung in diesem Fall besteht darin, mit diesen Anwendungen keine normalen Karten zu backen, wenn Sie sie woanders verwenden möchten. Wenn Sie ein kostenloses Programm benötigen, verwenden Sie xNormal . Dies ist ein branchenübliches Tool. Wenn Sie Substance irgendwo in der Pipeline zur Inhaltserstellung verwenden, verwenden Sie sie.


3ds Max hat die von Unity verwendete normale Karte gebacken. Der

einfachste Weg, dieses Problem zu bemerken, besteht darin, zu sehen, dass flache Flächen kleine Dellen oder Krümmungen aufweisen. In einigen Fällen kann dies sehr unauffällig sein, insbesondere bei organischen Objekten. Daher bleiben Probleme dieser Art oft unbemerkt.

Viele Nicht-Autodesk-Anwendungen haben auf eine Tangentenraum-Berechnungsmethode namens MikkTSpace umgestellt.. Sowohl xNormal als auch Substance sowie Blender, Unity, Unreal, Godot, Marmoset, Houdini, Modo und einige andere verwenden standardmäßig MikkTSpace oder unterstützen es zumindest irgendwie, was ihre Kompatibilität erheblich verbessert. Tatsächlich ist es in den letzten zehn Jahren in allen Fällen zum Industriestandard geworden, wenn normale Karten des Tangentenraums verwendet werden. Vermutlich wird 3ds Max irgendwann ihre Unterstützung hinzufügen, aber es ist unklar, ob die Entwickler das Backen normaler Karten mit MikkTSpace zulassen oder einfach mit ihrer Hilfe Unterstützung für das Anzeigen / Rendern bereitstellen möchten.

Export Meshes and Substance Painter


Ein weiteres Problem bei 3ds Max und Maya besteht darin, dass beim Exportieren von Maschen eine Exportoption mit „Tangenten und Binormalen“ vorhanden ist. Sie werden nicht in den tatsächlichen Tangenten von MikkTSpace sein, sondern auf ihnen basieren. Einige Anwendungen erzwingen die Standardneuberechnung des korrekten MikkTSpace (z. B. xNormal, Unity und Unreal), andere Anwendungen verwenden jedoch Tangentennetze (falls vorhanden) "wie sie sind" und berechnen MikkTSpace nur, wenn das Netz keine Tangenten enthält. Zum Beispiel verwendet Substance Painter Tangentennetze, wenn sie so vorhanden sind, wie sie sind, dh Painter erstellt normale Karten, die gebackenen 3ds Max sehr ähnlich sind! Ähnlich, aber nicht ganz gleich. Wenn Sie sie also wieder in 3ds Max importieren, sehen sie nicht so gut aus wie in Max gebacken.

MikkTSpace vs MikkTSpace?


Das nächste Problem ist, dass es mehr als eine Version von MikkTSpace gibt! Ja, das wäre nicht der Standard, wenn es irgendwie keine Verwirrung stiften würde. MikkTSpace legt fest, wie die Daten für jeden Scheitelpunkt im Netz gespeichert werden sollen und wie die Daten zum Rendern verwendet werden. Alle MikkTSpace-fähigen Anwendungen berechnen dieselben Netzdaten für Scheitelpunkte. Aber es gibt zwei verschiedene Möglichkeiten , um zu verwenden diese Daten in Rendering. MikkTSpace definiert, wie der Tangentenvektor und das Vorzeichen für jeden Scheitelpunkt basierend auf der UV-Ausrichtung berechnet werden. Bei Verwendung des Tangentenraums wird die Tangente an zwei Punkte (Bitangens) entweder für jeden Scheitelpunkt oder für jedes Pixel neu berechnet. Dieser Parameter sollte auch beim Backen und Anzeigen identisch sein.

xNormal und Substance haben die Möglichkeit, normale Karten mit beiden Methoden zu backen. Diese Optionen werden in Substanz als "Tangentenraum pro Fragment berechnen" und in xNormal als "Binormal im Pixel-Shader berechnen" bezeichnet. Sie müssen es nicht verwenden, wenn Sie für die integrierten Unity-Rendering-Methoden backen. Je nach gewähltem Typ kann es sich jedoch lohnen , dies für SRP zu tun!


XNormale „Pixel-Shader-Binormale“ mit integriertem Forward-Renderer Unity

Optisch sieht es so aus, als würde ein völlig anderer Tangentenraum verwendet, ist aber normalerweise viel weniger ausgeprägt. Einige Gesichter sehen möglicherweise so aus, als ob das Normal etwas verzerrt ist und keine große Beule aufweist. Die Lösung hier ist sehr einfach: Wählen Sie diese Option nicht aus, wenn Sie für die integrierten Rendering-Methoden von Unity backen. Aktivieren Sie das Kontrollkästchen, wenn Sie Unreal- oder Unity-Engines für HDRP backen.

Viele Quellen sagen, dass Blender und Unity identisch sind, aber tatsächlich ist dies niemals wahr! Blender verwendet wie Unity die Ausrichtung von MikkTSpace und OpenGL, verwendet jedoch wie Unreal Binormale für jedes Fragment-Binom.

Die gute Nachricht ist, dass die Shader LWRP, URP und Shader Graph jetzt Binormale für jeden Scheitelpunkt und die integrierten HDRP-Shader für jedes Pixel verwenden. In einem zukünftigen Update von Shader Graph (7.2.0) wird der Übergang zum pixelweisen Rechnen durchgeführt, und nach einiger Zeit werden auch die integrierten URP-Shader darauf umschalten. Wenn Sie eine solche Route wählen, können Sie die Standard-Rendering-Methoden mithilfe Ihrer eigenen Shader ändern.

Triangulieren, triangulieren, triangulieren!


Das letzte Problem sind verschiedene Arten der Triangulation. Wenn Sie Netze ohne vorläufige Triangulation exportieren, gibt es keine Garantie dafür, dass andere Anwendungen das Modell auf die gleiche Weise triangulieren. Dies schadet auch normalen Karten! Triangulieren Sie daher die Netze entweder mithilfe der Exportoptionen oder über den Triangulationsmodifikator.


Substance Painter , Unity , 3ds Max (quads)

Dies scheint einem völlig falschen Tangentenraum sehr ähnlich zu sein, als ob normale Karten in 3ds Max gebacken worden wären. Im allgemeinen Fall sind sie jedoch etwas schärfer, fast gebogen und sehen nicht wie eine glatte Konkavität aus. In diesem Netz ist an den Außenseiten eine X-Form sichtbar. Dieses Problem kann schwierig und ärgerlich sein, wenn mehrere Personen in verschiedenen Anwendungen mit dem Modell in der Pipeline für die Inhaltserstellung arbeiten, da es häufig nützlich ist, das Netz nicht zu triangulieren und schöne Polygone zu speichern. In diesem Fall müssen Sie sich entweder mit den Unannehmlichkeiten abfinden oder das letzte Werkzeug in der Pipeline erstellen, bevor Sie das Modell in das Spiel exportieren, das auch zum Generieren eines Netzes zum Backen von Normalen verwendet wird. Wie ein Tangentenraum mit Normalen von Eckpunkten (die Teil des Tangentenraums sind),Triangulation muss auch genau übereinstimmen.

Liste zum Erstellen perfekter normaler Karten für Unity


Hier sind Tipps zum Generieren von Tangentenraum-Normalkarten für Low-Poly-Netze aus den ursprünglichen High-Poly-Modellen zur Verwendung in Unity:

  • Sie müssen keine normalen Karten mit 3ds Max, Maya oder einer anderen Anwendung backen, die nicht über die Tangentenoption MikkTSpace verfügt .
  • Exportieren Sie Netze als Dreiecke mit Normalen und ohne Tangenten.
  • Wählen Sie beim Backen (sowie beim Erstellen eines Projekts für Substance Painter) OpenGL oder X + Y + Z + als Ausrichtung der normalen Karte.
  • Sie müssen die Tangentenoptionen für die beiden Punkte " pro Pixel " / " pro Fragment " nicht aktivieren,wenn Sie für die integrierten Rendering-Methoden (proaktiv oder verzögert) oder LWRP backen.
  • Fügen Sie Optionen fürTangenten an die beiden „pro Pixel“ / „pro Fragment“ Punktewenn für HDRP, und bald für URP backen.
  • Belassen Sie die Standardoptionen für den Modellimport für Unity, wobei die Normalen auf "Importieren" und die Tangenten auf "Mikktspace berechnen" eingestellt sind.

Das ist alles! Jedes Mal, wenn Sie perfekt gebackene normale Karten erhalten!


Hurra! Die perfekte normale Karte!


... mit Reflexionen? Ähm ...

Nun, der letzte, wir ignorieren es einfach. So „perfekt“ wie möglich mit komprimierten Texturformaten mit 8 Bit pro Kanal. Eine normale Dithering-Karte sieht möglicherweise etwas besser aus als Streifen, aber leider bieten nicht viele Tools diese Option. Andernfalls können Sie normale 16-Bit-Karten verwenden. Dies ist jedoch ein Thema für einen anderen Artikel.

Erfahren Sie mehr über MikkTSpace.


Die halboffizielle Website von mikktspace.com erklärt die wichtigsten Vorteile von MikkTSpace gut. Insbesondere eignet sich dieser Bereich sowohl zum Nachzählen als auch zum Übertragen von Tangentendaten zwischen Programmen mit unterschiedlicher Netzverarbeitung, während die Integrität der Ergebnisse erhalten bleibt. Der Site-Text ist eine Kopie der bereits aufgelösten Blender-Wiki-Seite, die von Morten S. Mikkelsen selbst geschrieben wurde. Leider wird nur die Version mit Tangenten an zwei Punkte für jedes Pixel erwähnt, nicht jedoch die Version für jeden Scheitelpunkt, die von Unity und xNormal verwendete Standardeinstellung. Da Blender Ableitungen von Tangenten pro Pixel verwendet, ist es logisch, dass nur diese erwähnt werden.

Hier sind Kommentare zu diesen beiden Optionen aus der ursprünglichen Datei mikktspace.h :

, /.

bitangent = fSign * cross(vN, tangent);



(/ ) , .

, , , «» , : vT, vB vN.

( )

vNout = normalize( vNt.x * vT + vNt.y * vB + vNt.z * vN );

vNt — . «» , , .



, , , .

Im ursprünglichen Beispiel wird die Tangente an zwei Punkte im Vertex-Shader neu erstellt und als weiterer interpolierter Wert an den Pixel-Shader übergeben. So behandeln die normalen Unity-Shader derzeit normale Karten. Ein Beispiel für die Ausführung dieser Aufgabe in einem Pixel-Shader ist eher ein spontanes als ein "Haupt" -Beispiel. Da die Implementierung für Unity 5.3 (und xNormal?) Von Morten S. Mikkelsen selbst erstellt wurde und beide Tangenten für jeden Scheitelpunkt verwenden, ist dies ein weiterer Beweis unserer Theorie. Aber dann verwendete Blender Pixel-für-Pixel-Tangenten, und Morten war ebenfalls beteiligt. Wahrscheinlich war es nur eine Option, die kleine Änderungen an den fertigen Unity-Shadern verursachte, und während für Echtzeitgrafiken keine der Methoden als viel besser angesehen wurde als die andere.

Der Vorteil der pixelweisen Implementierung besteht in der Eliminierung von zwei interpolierten Werten auf Kosten kleiner zusätzlicher Kosten für ALU (Pixel Shader Math). Dies bedeutet, dass wir anstelle der drei Werte von Vektor3 (Tangente, Tangente an zwei Punkte und Normal) nur Vektor4 und Vektor3 (Tangente mit Vorzeichen und Normal) benötigen. Bei modernen GPUs ist dies etwas schneller. Und es ist definitiv schneller, wenn es in der CPU ausgeführt wird, da es für Nicht-Echtzeit-Renderer verwendet werden kann. Unter diesem Gesichtspunkt ist es logisch, dass der Großteil der Branche beschlossen hat, die Tangente an zwei Punkte im Pixel und nicht an der Spitze neu zu erstellen.

Es ist lustig, dass Morten, als ich diesen Artikel schrieb, den Übergang in Unity SRP zu Pixel-für-Pixel-Tangenten auf zwei Punkte vorangetrieben hat! Es ist nur ein Pech, dass die in Unity integrierten Rendering-Methoden eine Reihe unbequemer Entscheidungen enthalten.



Tangentenraum in verschiedenen Anwendungen


Obwohl sich dieser Artikel hauptsächlich auf Unity konzentriert, wollte ich, dass meine Studie detaillierter wird, da diese Engine heute zum Mainstream geworden ist. Aus diesem Grund habe ich eine Liste verschiedener Anwendungen mit Informationen zur Verwendung des Tangentenraums erstellt.

Einheit (5.3+)


Ausrichtung: OpenGL Y +
Tangentenraum: MikkTSpace
Berechnung von Tangenten an zwei Punkte für MikkTSpace: für Eckpunkte oder für Pixel *

Hinweise:Standardmäßig definiert die Engine die Tangenten des Netzes beim Import zwangsweise neu, um MikkTSpace zu verwenden. Für fortgeschrittene Benutzer stehen Optionen für die Verwendung von Tangenten-Mesh zur Verfügung. Dies garantiert jedoch nicht die Kompatibilität mit normalen Karten, die in anderen Tools erstellt wurden, insbesondere bei Verwendung integrierter Shader. Sie können durch komplett eigene Shader ersetzt werden. Für seine integrierten Shader verwendet HDRP pixelweise Tangenten an zwei Punkte. Zum Zeitpunkt des Schreibens war geplant, dass die URP- und Shader Graph-Shader auch auf pixelweise Tangenten an zwei Punkte umstellen. Vor Unity 5.3 verwendete die Engine Lengyel- Tangenten , die weiterhin durch Auswahl der Option Legacy-Tangenten im Netzimporter verwendet werden können. Die integrierten Shader unterstützen diesen Tangentenraum jedoch nicht mehr.

Ergänzung: Vor URP 7.2.0 war die Verarbeitung normaler Karten in Shader Graph komplett unterbrochen! Weder MikkTSpace noch der Lengyel-Tangentenraum werden korrekt verwendet, und es ist unmöglich, dies im Shader-Diagramm zu beheben. Wenn möglich, aktualisieren Sie auf 7.2.0.

Unwirklicher Motor 4


Ausrichtung: Direct3D Y-
Tangentenraum: MikkTSpace
Berechnung von Tangenten an zwei Punkte für MikkTSpace: Pixel für Pixel
Hinweise: Standardmäßig definiert die Engine Tangenten des Netzes beim Importieren mit MikkTSpace neu. Für fortgeschrittene Benutzer stehen Optionen für die Verwendung eines Tangentennetzes zur Verfügung. Dies garantiert jedoch nicht die Kompatibilität mit normalen Karten, die in anderen Tools erstellt wurden.

Godot


Ausrichtung: OpenGL Y +
Tangentenraum: MikkTSpace
Berechnung von Tangenten an zwei Punkte für MikkTSpace: für jeden Scheitelpunkt
Hinweise: Wenn keine Tangentendaten vorhanden sind, können beim Import Tangentennetze in MikkTSpace berechnet werden. In der Engine-Dokumentation wird vorgeschlagen, Tangentialnetze zu exportieren. Da die meisten Werkzeuge jedoch nicht das richtige Tangentialnetz exportieren, würde ich diesen Tipp ignorieren. Selbst wenn Sie das ursprüngliche Tangentennetz verwenden, gibt es keine Garantie dafür, dass normale Karten richtig aussehen.

Playcanvas


Ausrichtung: OpenGL Y +
Tangentenraum: Lengyel / Schüler *
Berechnung von Tangenten an zwei Punkte: für jeden Scheitelpunkt / basierend auf Ableitungen
Anmerkungen: Bietet verschiedene Methoden zur Verarbeitung des Tangentenraums. Codegenerierte Tangenten verwenden MikkTSpace nicht. Es gibt Optionen für die Verwendung einer Tangente an zwei Punkte für jeden Scheitelpunkt, die entweder die Tangentenraumvektoren im Pixel-Shader "fastTbn" normalisieren, ohne den Tangentenraum im Fragment-Shader (den wir benötigen) zu normalisieren, da dies der Implementierung von MikkTSpace mit einer Berechnung für jeden Scheitelpunkt entspricht), oder sie verwenden die von Christian Schuler entliehene abgeleitete TBN ; Die Tangente des Netzes wird vollständig ignoriert und der Tangentenraum im Pixel-Shader berechnet. Jetzt werden standardmäßig auf Derivaten basierende Normalkarten verwendet, für die es meines Wissens keine Werkzeuge zum Backen exakter Normalkarten gibt. Es ist möglich, dass Sie Netze mit vorhandenen Normalen und Tangentendaten aus MikkTSpace importieren und dann die Materialoption "fastTbn" verwenden können, um die integrierten Rendering-Methoden von Unity abzugleichen. Ich bin jedoch der Meinung, dass dies im Code und nicht über die Editoroberfläche erfolgen sollte.

Glühfaden


Ausrichtung: OpenGL Y +
Tangentenraum: MikkTSpace
Berechnung von Tangenten an zwei Punkte für MikkTSpace: für jeden Scheitelpunkt
Hinweise: Abhängig von der zukünftigen Leistung kann die Engine auf pixelweise Tangenten an zwei Punkte umschalten.

3ds max


Ausrichtung: Direct3D Y- *
Tangentenraum: native
Mesh- Exportoptionen : Exportieren Sie FBX-Dateien mit aktiviertem Triangulate, aber deaktivierten Tangents und Binormals. Normalen müssen immer exportiert werden. Geteilte Normalen pro Scheitelpunkt können deaktiviert bleiben.
Hinweise: Standardmäßig geht 3ds Max davon aus, dass die Direct3D-Ausrichtung in normalen Karten verwendet wird, bietet jedoch Optionen zum Umkehren der X- und Y-Ausrichtung, wenn normale Kartentexturen auf Materialien verwendet werden. Beim Backen wird immer die Direct3D-Ausrichtung verwendet. Die Unterstützung für MikkTSpace wird in zukünftigen Versionen angezeigt.

Maya


Ausrichtung: OpenGL Y +
Tangentenbereich: native
Mesh- Exportoptionen : Exportieren Sie FBX-Dateien mit aktiviertem Triangulieren, aber deaktivierten Tangenten und Binormalen. Normalen werden immer exportiert. Geteilte Normalen pro Scheitelpunkt können deaktiviert bleiben.
Anmerkungen: Einige Leute haben mir gesagt, dass Maya MikkTSpace teilweise bereits unterstützt, aber ich weiß nicht, in welchem ​​Umfang.

Mixer (2,57+)


Ausrichtung: OpenGL Y +
Tangentenraum: MikkTSpace
Berechnung von Tangenten an zwei Punkte für MikkTSpace: für jedes Pixel Mesh-Exportoptionen
: Exportieren Sie FBX-Dateien mit dem Glättungswert "Nur Normalen". Sie können mit oder ohne Tangent Space exportieren, wenn die Zielanwendung auch MikkTSpace verwendet, z. B. Unity oder Unreal.
Hinweise: Blender verfügt beim Exportieren in FBX nicht über eine Triangulationsoption. Verwenden Sie daher zuerst den Modifikator Triangulieren. Normale Karten, die in Blender gebacken wurden, sind nicht 100% kompatibel mit Unity. Wenn Sie jedoch den grünen Kanal in einer Drittanbieteranwendung oder in benutzerdefiniertem Material umdrehen, funktionieren sie in Unreal perfekt.

xNormal (3.17.5+)


Ausrichtung: benutzerdefiniert
Tangentenraum: MikkTSpace *
Berechnung der Tangenten an zwei Punkte für MikkTSpace: benutzerdefiniert (für jeden Scheitelpunkt oder Pixel)
Optionen zum Backen normaler Karten:bietet Optionen zum Umdrehen aller drei Achsen der normalen Karte während des Exports. Einheit braucht X + Y + Z +. Es besteht auch die Möglichkeit, Tangenten an zwei Punkte für jeden Scheitelpunkt oder jedes Pixel (d. H. Fragment) zu verwenden. Standardmäßig verwendet xNormal Tangenten an zwei Punkte für jeden Scheitelpunkt. Dies kann jedoch im Plugins Manager-Menü (Netzsteckersymbol in der unteren linken Ecke) geändert werden, indem Sie auf "Tangentenbasisrechner", "Mikk - TSpace" und dann auf "Konfigurieren" klicken. Ein Popup-Fenster mit der einzigen Option "Binormal im Pixel-Shader berechnen" wird angezeigt. Es muss für Unity ausgeschaltet und für Unreal eingeschaltet sein.
Anmerkungen:Obwohl xNormal nur MikkTSpace unterstützt, unterstützt sein Plugin-System theoretisch jeden Tangentenraum. Bisher ist das einzige mir bekannte Tangentenraum-Plugin zum Backen des Unity 4-Tangentenraums konzipiert und bereits nutzlos. Das heißt, wenn die Anwendung realistisch angegangen wird, unterstützt sie nur MikkTSpace.

Substanzmaler


Ausrichtung: anpassbar (OpenGL oder Direct3D)
Tangentenraum: MikkTSpace
Berechnung von Tangenten an zwei Punkte für MikkTSpace: anpassbar (für Scheitelpunkte oder Pixel) Backoptionen
für normale Karten: Backoptionen in OpenGL- oder Direct3D-Ausrichtung. Und eine Option zum Verwenden von Tangenten an zwei Punkte für jeden Scheitelpunkt oder jedes Pixel (Fragment), die mit dem Parameter „Tangentenraum pro Fragment berechnen“ konfiguriert wird. Beim Exportieren für integrierte Unity-Rendering-Methoden müssen Sie OpenGL auswählen und die Option Tangentenraum pro Fragment in den Projekt- und Exportoptionen berechnen deaktivieren. Beim Exportieren nach Unreal oder Unity HDRP ist das Gegenteil der Fall.
Anmerkungen:Substance Painter verwendet standardmäßig die Tangentendaten, die das importierte Netz verwendet. Wenn Sie nicht aus Blender exportieren, brauchen Sie es nicht! Es gibt jedoch keine Optionen zum Deaktivieren dieser Funktion. Exportieren Sie Netze ohne Tangenten, bevor Sie sie in Substance Painter importieren . Früher in der Stoffdokumentation wurde fälschlicherweise behauptet, dass die Berechnungen der Tangenten an zwei Punkte
in Blender der Einheit entsprechen, aber jetzt wurde der Fehler behoben!

Marmoset Toolbag 3


Ausrichtung: Benutzerdefiniert
Tangentenraum: Benutzerdefiniert
Berechnung von Tangenten an zwei Punkte für MikkTSpace: Pixel für Pixel
Hinweise: Es sieht so aus, als ob das Programm Optionen zum Anzeigen oder Backen normaler Karten in fast jeder vorhandenen Konfiguration bietet. Einschließlich vorgefertigter Einstellungen für Tangentenräume 3ds Max und Maya! Die Tangentenraumoption „Mikk / xNormal“ verwendet jedoch pixelweise Tangenten an zwei Punkte, die nicht geändert werden können. Das heißt, die Marmoset Toolbag 3 kann normale Karten für die integrierten Unity-Rendering-Methoden nicht richtig anzeigen oder backen. Möglicherweise ändert sich die Situation in zukünftigen Versionen, da sich die Entwickler des Problems bewusst sind.

3DCoat


Ausrichtung: benutzerdefiniert
Tangentenraum: benutzerdefiniert
Berechnung von Tangenten an zwei Punkte für MikkTSpace :?
Hinweise: Es gibt viele Optionen zum Anzeigen und Backen normaler Karten. Es ist perfekt in der Lage, Blender und UE4 abzugleichen, daher unterstützt es pixelweise Tangenten an zwei Punkte, aber ich weiß nicht, ob Vertex-Tangenten an zwei Punkte in der Unity-Voreinstellung verwendet werden.

Houdini (16.0.514+)


Ausrichtung: anpassbar
Tangentenraum: anpassbar *
Berechnung von Tangenten an zwei Punkte für MikkTSpace: Pixel für Pixel
Hinweise: Unterstützt die eigene Basis von Tangenten oder MikkTSpace, sowohl zum Anzeigen als auch zum Backen, jedoch nur in der Pixel-für-Pixel-Version. Es scheint, dass MikkTSpace standardmäßig nicht zum Rendern verwendet wird, sondern mit Houdini 17.5 beginnt. Netze können mit integrierten Knoten geändert werden, um tangentialen MikkTSpace zu verwenden.

Modo (10+?)


Orientierung: benutzerdefinierte
Tangentenraum: individuelle
Berechnung der Zweipunkt - Tangenten für MikkTSpace: custom (Vertex oder Pixel- für -Pixel) *
Anmerkungen: es sieht aus wie es unterstützt Rendering und Backen in verschiedenen Tangentialräumen, sowie die Möglichkeit , Pixel- für -Pixel - Tangenten an zwei Punkten für den Export. Ich habe das nicht getestet.

Knald


Ausrichtung: Benutzerdefiniert
Tangentenraum: MikkTSpace
Berechnung von Tangenten an zwei Punkte für MikkTSpace: Pixel für Pixel
Hinweise: Standardmäßig wird MikkTSpace verwendet und die Tangenten importierter Netze werden neu definiert. Bei Bedarf können jedoch vorhandene Tangentennetze verwendet werden. Die Ausrichtung normaler Karten kann mit einem Parameter umgedreht werden, der für das gesamte Projekt gilt.



Abschließend


Ein wichtiger Aspekt ist, dass, wenn das Low-Poly-Modell, auf dem Sie backen, nur eine Ebene ist (z. B. zum Kacheln von Texturen), alles, was geschrieben wird, keine Rolle spielt und Sie mit jedem Werkzeug backen können ... wenn Sie einfach alles in der richtigen Ausrichtung halten oder später die entsprechenden Texturkanäle umdrehen.

Darüber hinaus sind die meisten im Artikel aufgeführten Probleme nur bei soliden Modellen erkennbar. Organische Formen können die subtilsten Unterschiede verbergen, z. B. den Unterschied zwischen Scheitelpunkt und Pixel-für-Pixel-Tangenten an zwei Punkte.

Source: https://habr.com/ru/post/undefined/


All Articles