Tangential, binormal und andere Shader-bezogene Dinge

8

Viele der Kartierungstechniken, einschließlich normaler Bump-Mapping, Parallax Mapping und anderen, erfordern die spezielle Tangentialraum-Basis pro Vertex (tangential, normal, binormal / bitangent).

Dies bedeutet natürlich, dass meine Modelle nicht nur Vertex-Positionen , Texturkoordinaten und genäherte Vertexnormalen , sondern auch einen von exportieren sollen die Tangentialraumbasisvektoren (normalerweise tangent ), weil die andere direkt im Shader mit cross(tangent, normal) gefunden werden kann.

Beachten Sie, dass Position, Normal, UV und Tangenten tatsächlich voneinander abhängig sind wie folgt (Sie müssen alles andere über den Scheitelpunkt wissen, um die Tangentenbasis vorzubereiten).

%Vor%

Nun, wie wird diese Art von Dingen in modernen 3D-Spielen / Rendering-Engines gehandhabt?

Liefern sie eigentlich die Normalen , die Tangenten und die UV-Koordinaten pro Knoten oder können sie in Runtime berechnet werden? ? Sollten sie der Teil der Modelldaten sein oder sollten sie eine Laufzeiteigenschaft sein?

Ich weiß auch, dass man bei der Verwendung von Direct3D10+ mit den Geometrieshadern die Normalen und die Tangenten tatsächlich zur Laufzeit vorbereiten kann (natürlich, weil wir Zugriff auf die Eckpunkte in jedem Dreieck haben) - ist es wert oder sollten diese Dinge immer vorberechnet sein?

    
Yippie-Ki-Yay 07.11.2010, 17:35
quelle

5 Antworten

6

Meine Ansicht ist wie folgt:

UV-Koordinaten : eindeutig vorberechnet. Das UV-Auspacken eines komplexen Modells ist keine triviale, algorithmische Aufgabe und beinhaltet normalerweise das manuelle Platzieren von Nähten für das beste Ergebnis. Wenn Ihr Modell mit einem Textur-Skin geliefert wird, müssen die UVs mit dem Skin übereinstimmen. In diesem Fall werden sie möglicherweise nicht zur Laufzeit berechnet.

Normalen: theoretisch könnten Sie sie beim Laden in einem Geometrieshader oder sogar auf der CPU vorberechnen. Aber es gibt eine Sache: Die realen Modelle in Spielen sind oft NICHT die Originalmodelle, sondern Versionen mit niedrigerer Polygonzahl. Im endgültigen Modell, das im Spiel verwendet wird, haben Sie weniger Scheitelpunkte als den Vertex Normale werden genauer aus dem ursprünglichen High-Poly-Modell berechnet (das auch für die Berechnung der Umgebungsokklusion usw. verwendet wird). Daher ist es auch möglich, die Normalen vorberechnet zu haben.

Außerdem wird in vielen Spielen eine Textur mit per-texel normaler Karte (normalerweise im Tangentialraum, AFAIK) zusammen mit der Farbtextur für jedes Modell zum Zwecke der parallelen Zuordnung später bereitgestellt der Pixelshader.

Daher scheint mein Vorschlag klar zu sein - für vorberechnete Daten zu gehen, bessere Details zu haben und entweder Shader-Verarbeitung oder Ladezeit zu sparen - es sei denn, Sie müssen sich Gedanken über die Modellgröße machen limit) - nur dann, wenn die im Geometrieshader berechneten Normalen etwas Platz sparen würden.

    
Kos 11.11.2010, 18:54
quelle
3

Im Allgemeinen möchten Sie so viel wie möglich vorberechnen. Die meisten Engines verfügen über ein benutzerdefiniertes Tool, das Rohdaten aus 3D-Software aufnehmen und in ein Format für die Laufzeit einmassieren kann (Hinzufügen von Tangenten und Bit-Tangenten usw.). Allerdings ...

In bestimmten Situationen kann der pro-Vertex-Speicher-Overhead ein besonderes Leistungsrisiko darstellen. Dies liegt daran, dass ein Overhead mit dem Verschieben von Daten über das System verbunden ist - es ist "versteckt", weil es nicht explizit als Anweisung in einen Shader hinzugefügt wird, also ist es etwas fortgeschrittener.

In diesen Fällen wird der Bit-Tangent möglicherweise nicht vorberechnet und stattdessen zur Laufzeit erstellt (um die Größe des Scheitelpunkts im Speicher zu reduzieren). Bitangents sind dafür geeignet, da sie aus normal , Tangens und einem Directionality-Flag erstellt werden können sind alle Eigenschaften eines einzelnen Eckpunkts.

Normale , einige UV-Mappings und andere Dinge erfordern Kenntnisse über die "Topologie" des Netzes - und diese Topologie ist normalerweise in Laufzeitdaten nicht vorhanden. Sie erfordern auch zusätzliche Markierungen von den Künstlern; wie scharfe Kanten und Texturnähte usw. Aus diesem Grund werden Normale , UVs und der erste Tangens fast immer für alle vorberechnet spezielle Arten von Geometrie.

Denken Sie daran, dass sich die Darstellung eines Modells in Max, Maya oder Blender sehr von der Laufzeitversion unterscheidet.

Editorsoftware

  • Suppe aus Dreiecken und Quads, mit Nachbarinformationen
  • Kanten sind als scharf / weich markiert
  • ein einzelner Vertex kann mehrere Normalen und mehrere UV-Coords haben

Laufzeit (für DirectX, OpenGL usw.)

  • Cache freundliche Sammlung von Dreiecksbändern und Dreiecksfans
  • Kanten sind implizit, es sind keine zusätzlichen Informationen mit ihnen verbunden
  • jeder Vertex hat nur eine Position, eine normale und eine UV-Koordinate (pro Textur)
  • existiert manchmal auf mehreren Detailebenen

Im Allgemeinen verlieren Sie viele Informationen, die nicht rekonstruiert werden können. Ihre Künstler werden am glücklichsten sein, wenn Sie so viel wie möglich mit der ursprünglichen Max / Maya-Version der Geometrie machen.

    
David Jewsbury 14.11.2010 09:37
quelle
2

Sie können dies auch mit ID3DXMesh in D3D9 tun. Sie sollten sie immer im Voraus berechnen - denn es ist verschwenderisch, sie zur Laufzeit neu zu berechnen. Für jedes Mesh würden Sie diese jedoch nur einmal berechnen. Wenn Ihr Programm also keine Meshes erzeugt, ist es wahrscheinlich kein Problem, wo und wann es gemacht wird.

Die einzige wichtige Sache hier ist, sie auf der CPU zu berechnen, nicht auf der GPU, weil Sie diese Arbeit immer wieder auf der GPU in jedem Frame machen, was eine Verschwendung im Vergleich zu nur einmal auf der CPU ist. Soweit ich weiß, berechnen alle 3D-Rendering-Systeme einmal die Normalen und solche auf der CPU, speichern sie in der Datei und laden sie dann und senden sie zur Arbeit an die GPU.

    
Puppy 09.11.2010 17:52
quelle
1

Ich bevorzuge es, sie vorher zu berechnen, da Sie eine spezielle Handhabung mit Nähten, gespiegelten Texturen, Wraparounds und so weiter benötigen.

Es ist nicht ganz trivial, es zur Laufzeit zu berechnen, da Sie möglicherweise mehr als die aktuellen Dreiecksdaten benötigen, um einen korrekten Tangentialraum zu erhalten.

    
Macke 09.11.2010 18:22
quelle
0

UVs und Normalen sind normalerweise unter der Kontrolle des Künstlers. Tangenten und Binormale können mit dem Gradienten der UVs berechnet werden. Es ist in der Regel ein wenig teuer, die Tangenten- und Binormalwerte die ganze Zeit zu berechnen, daher berechnen Sie sie normalerweise einmal basierend auf der zugrunde liegenden Geometrie vorberechnen. Vorzugsweise vor dem Versand, um Ladezeiten zu reduzieren.

    
MSN 12.11.2010 19:40
quelle

Tags und Links