Unterstützung für Gittermodelle in D3DX (Direct3D 9)
Bei D3DX handelt es sich um eine Hilfsprogrammbibliothek, die Dienste für Hilfsprogramme bereitstellt. Sie befindet sich eine Schicht über der Direct3D-Komponente.
Gittermodelle
D3DX implementiert das Gittermodellkonstrukt zum Laden, Bearbeiten und Rendern von Inhalten in X-Dateien. Ein Gittermodell ist im Grunde eine Sammlung von Vertices, die einige geometrische Modelle definieren, und eine Reihe von Indizes, die die Flächen definieren. Es gibt mehrere Gittermodelltypen.
ID3DXBaseMesh liefert die Grundlagen. ID3DXMesh- erbt von ID3DXBaseMesh und fügt eine Gittermodelloptimierung mithilfe des Vertexcaches pro Chip hinzu. ID3DXSkinInfo bietet Unterstützung für das Skinning von Gittermodellen.
ID3DXBaseMesh stellt Methoden zum Bearbeiten und Abfragen von ID3DXMesh-Gittermodellobjekten bereit, die vom Basisgittermodell erben. Dazu gehören Adjazenzvorgänge, Geometriepufferabrufe, Sperr- und Entsperrvorgänge (Vertex und Index) sowie Kopier-, Render-, Flächen- und Vertexinformationen.
Hinweis
Die in früheren Versionen von Direct3D 9 verfügbaren Schnittstellen ID3DXPMesh und ID3DXSPMesh für die Unterstützung progressiver und vereinfachter Gittermodelle werden nicht mehr unterstützt.
Gittermodellarchitektur
Ein Gittermodell enthält die Daten eines komplexen Modells. Es handelt sich dabei um einen Container für abstrakte Daten, der Ressourcen wie Texturen und Materialien sowie Attribute wie Positions- und Adjezenzdaten enthält. Es gibt mehrere Gittermodellvorgänge, die die Aufrufleistung und das Erscheinungsbild einer Oberfläche verbessern. Darüber hinaus gibt es eine Reihe anderer Gittermodellkonzepte, die sich auf die Funktionalität von Gittermodellvorgängen auswirken. Mit einem guten Verständnis dieser Gittermodellkonzepte können Sie diese anwenden, um die Leistung von Gittermodellen zu verbessern.
Objektdaten von Gittermodellen
Ein Gittermodell enthält einen Vertexpuffer, einen Indexpuffer und einen Attributpuffer.
- Der Vertexpuffer enthält die Vertexdaten, bei denen es sich um die Vertices des Gittermodells handelt.
- Der Indexpuffer enthält Vertexindizes für den Zugriff auf den Vertexpuffer. Das kann durch die Reduktion doppelter Vertices zu einer geringeren Vertexpuffergröße führen. Der Indexpuffer wird ausschließlich von einem indizierten Gittermodell verwendet. Beispiel: Wenn ein Gittermodell aus einer Dreiecksliste besteht, wird der Indexpuffer nicht verwendet.
- Der Attributpuffer enthält Attributdaten. Bei Attributen handelt es sich um Eigenschaften der Gittermodellvertices ohne bestimmte Reihenfolge. Ein D3DX-Gittermodell speichert für jede Fläche Attribute in einer Gruppe von DWORDS.
Attributtabellen
Bei einer Attributtabelle handelt es sich um eine präzise Darstellung des Inhalts eines Attributpuffers. Attributtabellen können folgendermaßen erstellt werden: durch Aufrufen einer der Optimize-Methoden mit D3DXMESHOPT_ATTRSORT, durch Sperren des Attributpuffers und Füllen mit Daten oder durch Aufrufen der SetAttributeTable-Methode. Ein Gittermodell enthält eine Attributtabelle, wenn es in Gruppen neu angeordnet wird. Das geschieht beim Aufrufen der Optimize-Methode, sofern eine Attributsortierungsoption (D3DXMESHOPT_ATTRSORT oder höher) angegeben wurde. D3DX-Gittermodelle verwenden indizierte Dreieckslisten und werden daher mit IDirect3DDevice9::DrawIndexedPrimitive aufgerufen.
Attributtabellen werden infolge des Optimize-Aufrufs erstellt. Die Flächen müssen nicht nebeneinander angeordnet werden, da sie durch den Optimize-Aufruf nebeneinander angeordnet werden. Beispielsweise könnten die Hände eines menschlichen Gittermodells dasselbe Attribut verwenden. Anhand der ID können Flächen in Gruppen sortiert werden. Gittermodelle aus X-Dateien verfügen über automatisch generierte Attribute für Material- und Textureigenschaften. Sie müssen die Optimize(ATTRSORT)-Methode oder die effektivere Optimize(VERTEXCACHE)-Methode aufrufen, um eine gute Leistung zu erzielen. Die Ladefunktionen versuchen, die Daten in genau der Form darzustellen, in der sie gespeichert wurde. Bei der Verwendung eines Gittermodells, das auf dem Vertex- oder Indexpuffer basiert, bietet die Gittermodell-API Optimierungsfunktionen und Skinningtransformationen mit geringem Overhead.
Die Optimierungstypen sind kumulativ, wobei D3DXMESHOPT_COMPACT die geringste und D3DXMESHOPT_IGNOREVERTS die höchste Optimierung aufweist. D3DXMESHOPT_STRIPREORDER führt eine Komprimierung und Attributsortierung durch. D3DXMESHOPT_VERTEXCACHE wird für alle Geräte empfohlen, selbst für die ohne echten Vertexcache.
Anwendungsdaten
Bei Anwendungsdaten handelt es sich um Gittermodelldaten, die von einer Anwendung verwaltet werden. Es besteht eine enge Beziehung zwischen den Vertexdaten von Gittermodellen und den Daten, die von diesen Puffern verwaltet werden.
Der Materialpuffer enthält n Materialien. Die Materialien werden von der Load-Funktion beim Laden der X-Datei zurückgegeben. Jede Teilmenge kann über eigene Materialien und Texturen verfügen. Der Materialpuffer ist statisch.
Der Adjezenzpuffer enthält Informationen zu Kanten, Flächen und angrenzenden Flächen. Einige Gittermodellvorgänge hängen vom Wissen darüber ab, welche Flächen nebeneinander liegen. Diese als Adjezenzdaten bezeichneten Informationen werden in einem Adjezenzpuffer gespeichert. Sie sind kein Teil des Gittermodells, sondern werden von der Anwendung verwaltet und müssen bei Bedarf an die Gittermodellmethoden übermittelt werden.
Der Effektinstanzpuffer enthält eine Liste der Effektinstanzen. Eine Effektinstanz speichert den Status. Diese Statusinformationen werden verwendet, um die Pipeline zu initialisieren. Eine Effektinstanz enthält die Namen-Wert-Paare eines Effekts.
Optimierte Gittermodelle
Optimierte Gittermodelle bauen auf der Funktionalität des Basisgittermodells auf und fügen eine Optimierungsfunktion für den Vertexcache mit zwei Methoden hinzu: Optimize, mit der ein neues Gittermodell erstellt wird, und OptimizeInPlace, mit der das ursprüngliche Gittermodell geändert wird.
D3DXGeneratePMesh verwendet den D3DX-Vereinfachungsalgorithmus, um aus dem Eingabemodell ein progressives Gittermodell zu generieren. D3DXSimplifyMesh generiert mit demselben Vereinfachungsalgorithmus aus einem Eingabegittermodell ein Standardgittermodell für die angegebene LOD-Stufe (Level-Of-Detail, Detaillierungsgrad). Benutzer*innen können die Fehlermetrik durch die pro Vertexkomponente und Vertex angegebenen Gewichtungen steuern. Die Gewichtungen pro Komponente werden mit dem Anteil an pro Edge Collapse berechneten Fehlern dieser Komponenten multipliziert. Die Gewichtungen pro Vertex werden mit dem Wert der Fehlermetrik multipliziert, der für die Entfernung dieses Vertex bestimmt wird. Beispiel: Wenn ein Vertex nie entfernt werden soll, legen Sie die Gewichtung dieses bestimmten Vertex auf einen hohen Wert fest. Wenn Sie es den Vertex hingegen früher entfernen möchten, legen Sie einen niedrigen Wert (unter 1) fest.
ID3DXSkinInfo unterstützt das Skinning von Charakteren. Ein Charakter mit Skinning wird durch eine Reihe von Gittermodellen und Knochen definiert, die Einfluss auf die Vertices des Gittermodells haben. Die Knochen werden als Transformationshierarchie dargestellt. Jedes Gittermodell verfügt über eine Matrix für jeden Knochen, der das Modell beeinflusst. Dadurch wird das Gittermodell in den lokalen Koordinatenbereich des Knochens überführt. Diese Matrix stellt die Transformation des Knochens für das Gittermodell im Knochenbereich dar. Diese wird während des Erstellungsprozesses definiert, wenn das Skelett dem Gittermodell zugeordnet wird.
Skinning
Bei Skinning handelt es sich um eine Technik, bei der Gittermodellvertices mithilfe von Knochen transformiert werden. Knochen sind in der Regel in einem hierarchischen Skelett angeordnet, das dem menschlichen Skelett ähnelt. Objektvertices werden dann den Knochen zugeordnet, z. B. beim Anfügen der Haut an die Knochen. Wenn die Knochen transformiert werden, wird die Haut ebenfalls transformiert.
Gittermodelle mit Skinning verwenden Knochen, um eine Reihe von Vertices zu beeinflussen. Die Transformationsdaten für Knochen werden von Benutzer*innen bereitgestellt, um die SRT-Transformation der Knochen zu beeinflussen. Das Gittermodell verwendet die transformierten Knochen, um die Vertices zu beeinflussen, die den Knochen zugeordnet sind. Bei Paletten handelt es sich um Arrays von SRT-Transformationen. Paletten werden häufig als Matrizen implementiert, sie können jedoch SRT-Werte enthalten.
Trimmen progressiver Gittermodelle
Bereiche mit geringer Detailstufe können auf Vertices verzichten, die das gerenderte Erscheinungsbild der Oberfläche nicht ändern. Das gilt insbesondere für Objekte mit größerer Entfernung zur Kamera. Dieser Vorgang wird als Detaillierungsgrad (Level-Of-Detail, LOD) bezeichnet. Benutzer*innen können den Detaillierungsgrad auf API-Ebene steuern, um die Renderingeffizienz zu maximieren.
Objekte progressiver Gittermodelle verfügen zunächst über eine hohe Anzahl an Flächen, die sie mithilfe von Vereinfachungsvorgängen verringern. Ein von der Ansicht unabhängiges progressives Gittermodell wird als ansichtsunabhängiges progressives Gittermodell (View-Independent Progressive Mesh, VIPM) bezeichnet.
Eine weitere Möglichkeit zum Reduzieren der Flächenanzahl ist das Trimmen. Dabei werden Vertices und Flächen aus dem Gittermodell entfernt. Das Trimmen kann am oberen Ende erfolgen (um die maximale Anzahl an Flächen zu begrenzen) oder am unteren Ende (um die minimale Anzahl an Flächen zu begrenzen.) Das Trimmen verbessert zwar die Aufrufleistung, jedoch sollte dieser Vorgang mit Bedacht ausgeführt werden, um die visuelle Qualität zu wahren. Das Trimmen wird im SDK-Beispiel zu progressiven Gittermodellen veranschaulicht.
Für Bereiche mit hoher Sichtbarkeit kann die Auflösung mit einem progressiven Detaillierungsgrad (Progressive Level Of Detail, PLOD) erhöht werden. Mit dieser Technik kann eine einzelne Fläche in zwei geteilt werden.
Patchgittermodelle
Zwei spezielle Arten von Patchgittermodellen werden ebenfalls unterstützt: Rechteck- und Dreieckpatches. Bei den Rechteckpatches handelt es sich um ein Patchgittermodell, dessen Kontrollpunkte in einer gewundenen, rechteckigen Reihe angeordnet sind. Rechteck- und Dreieckpatches werden zum Erstellen von Oberflächen mit höherer Ordnung verwendet. Sie werden weniger häufig als Dreieckgittermodelle verwendet.
Zugehörige Themen