it-swarm.com.de

Rendernetzwerke mit mehreren Indizes

Ich habe einige Scheitelpunktdaten. Positionen, Normalen, Texturkoordinaten. Ich habe es wahrscheinlich aus einer .obj-Datei oder einem anderen Format geladen. Vielleicht zeichne ich einen Würfel. Jedes Vertex-Datenelement hat jedoch einen eigenen Index. Kann ich diese Mesh-Daten mit OpenGL/Direct3D rendern?

50
Nicol Bolas

Im allgemeinsten Sinne nein. OpenGL und Direct3D erlauben nur einen Index pro Vertex. Der Index wird aus jedem Scheitelpunktdatenstrom abgerufen. Daher muss jede eindeutige Kombination von Komponenten einen eigenen Index haben.

Wenn Sie also einen Würfel haben, in dem jedes Gesicht seine eigene Norm hat, müssen Sie die Position und die normalen Daten häufig replizieren. Sie benötigen 24 Positionen und 24 Normalen, obwohl der Würfel nur 8 eindeutige Positionen und 6 eindeutige Normalen hat.

Am besten akzeptieren Sie einfach, dass Ihre Daten größer werden. Viele Modellformate verwenden mehrere Indizes. Sie müssen diese Scheitelpunktdaten korrigieren, bevor Sie sie rendern können. Viele Tools zum Laden von Netzen, wie Open Asset Importer, führen diese Korrektur für Sie durch.

GL 3.x und D3D10

Bei Hardware der D3D10/OpenGL 3.x-Klasse ist es möglich, das Ausführen von Fixups zu vermeiden und mehrere indizierte Attribute direkt zu verwenden. Beachten Sie jedoch, dass dies wahrscheinlich die Renderleistung beeinträchtigt.

In der folgenden Diskussion wird die OpenGL-Terminologie verwendet, Direct3D v10 und höher verfügt jedoch über entsprechende Funktionen.

Die Idee ist, manuell über den Vertex-Shader auf die verschiedenen Vertex-Attribute zuzugreifen. Anstatt die Scheitelpunktattribute direkt zu senden, sind die übergebenen Attribute tatsächlich die Indizes für diesen bestimmten Scheitelpunkt. Der Vertex-Shader verwendet dann die Indizes, um über ein oder mehrere Puffer-Texturen auf das eigentliche Attribut zuzugreifen.

Attribute können in mehreren Puffertexturen oder in einem gespeichert werden. Wenn letzteres verwendet wird, muss der Shader zu jedem Index einen Offset hinzufügen, um den Startindex des entsprechenden Attributs im Puffer zu finden.

Reguläre Eckpunktattribute können auf viele Arten komprimiert werden. Puffertexturen haben weniger Komprimierungsmöglichkeiten und erlauben nur ein relativ begrenzte Anzahl von Scheitelpunktformaten (über die von ihnen unterstützten Bildformate).

Bitte beachten Sie erneut, dass jede dieser Techniken die gesamte Vertex-Verarbeitungsleistung verringern kann. Daher sollte es nur unter den speicherbeschränktesten Umständen verwendet werden, nachdem alle anderen Komprimierungs- oder Optimierungsoptionen ausgeschöpft wurden.

OpenGL ES 3.0 bietet auch Puffertexturen. In höheren OpenGL-Versionen können Sie Pufferobjekte direkter über SSBOs lesen als über Pufferstrukturen, die möglicherweise bessere Leistungseigenschaften aufweisen.

65
Nicol Bolas

Ich habe einen Weg gefunden, der es Ihnen ermöglicht, diese Art von Wiederholung zu reduzieren, die etwas von den in der anderen Antwort gemachten Aussagen abweicht (aber nicht speziell auf die hier gestellte Frage passt). Es geht jedoch um meine Frage , die als Wiederholung dieser Frage gedacht wurde.

Ich habe gerade über Interpolation Qualifiers erfahren. Speziell "flach". Ich verstehe, dass das Setzen des flachen Qualifikationsmerkmals in die Ausgabe des Vertexshader dazu führt, dass nur der erregende Vertex seine Werte an den Fragment-Shader übergibt.

Dies bedeutet für die in diesem Zitat beschriebene Situation:

Wenn Sie also einen Würfel haben, bei dem jedes Gesicht seine eigene Normalität hat, müssen Sie die Position und die normalen Daten häufig replizieren. Sie benötigen 24 Positionen und 24 Normalen, obwohl der Würfel nur 8 eindeutige Positionen und 6 eindeutige Normalen hat.

Sie können 8 Scheitelpunkte haben, von denen 6 die eindeutigen Normalen enthalten, und 2 Normalwerte werden ignoriert, sofern Sie Ihre Primitivindizes sorgfältig so anordnen, dass der "provozierende Scheitelpunkt" die normalen Daten enthält, die Sie auf das gesamte Gesicht anwenden möchten.

EDIT: Mein Verständnis, wie es funktioniert:

 enter image description here

 enter image description here

 enter image description here

 enter image description here

0
gunfulker