Geometry Blending (Direct3D 9)

Direct3D ermöglicht es einer Anwendung, den Realismus ihrer Szenen zu erhöhen, indem segmentierte polygonale Objekte - insbesondere Zeichen - gerendert werden, die nahtlos gemischte Verbindungen aufweisen. Diese Effekte werden häufig als Skinning bezeichnet. Das System erreicht diesen Effekt, indem es zusätzliche Welttransformationsmatrizen auf einen einzelnen Satz von Scheitelpunkten anwendet, um mehrere Ergebnisse zu erstellen, und dann eine lineare Mischung zwischen den resultierenden Scheitelpunkten ausführt, um einen einzelnen Satz von Geometrien für das Rendern zu erstellen. Die folgende Abbildung einer Banane zeigt diesen Prozess.

Abbildung des Prozesses zum Mischen von zwei Objekten mit Bananentextur

Die obige Abbildung zeigt, wie Sie sich den Prozess der Geometriemischung vorstellen können. In einem einzelnen Renderingaufruf übernimmt das System die Scheitelpunkte für die Banane, transformiert sie zweimal - einmal ohne Änderung und einmal mit einer einfachen Rotation - und mischt die Ergebnisse, um eine gebogene Banane zu erzeugen. Das System mischt die Scheitelpunktposition sowie den Scheitelpunkt normal, wenn die Beleuchtung aktiviert ist. Anwendungen sind nicht auf zwei Mischpfade beschränkt. Direct3D kann Geometrie zwischen bis zu vier Weltmatrizen, einschließlich der Standardweltmatrix, D3DTS_WORLD.

Hinweis

Wenn die Beleuchtung aktiviert ist, werden Vertexnormale durch eine entsprechende inverse Weltsichtmatrix transformiert, die auf die gleiche Weise gewichtet wird wie die Vertexpositionsberechnungen. Das System normalisiert den resultierenden Normalvektor, wenn der D3DRS_NORMALIZENORMALS Renderzustand auf TRUE festgelegt ist.

 

Ohne Geometrie-Blending werden dynamische artikulierte Modelle häufig in Segmenten gerendert. Betrachten Sie für instance ein 3D-Modell des menschlichen Arms. In der einfachsten Ansicht hat ein Arm zwei Teile: den Oberarm, der mit dem Körper verbunden ist, und den Unterarm, der mit der Hand verbunden ist. Die beiden sind am Ellenbogen verbunden, und der Unterarm dreht sich an diesem Punkt. Eine Anwendung, die einen Arm rendert, kann Vertexdaten für den oberen und unteren Arm speichern, jeweils mit einer separaten Welttransformationsmatrix. Dies wird im folgenden Codebeispiel veranschaulicht.

typedef struct _Arm
{
    VERTEX upper_arm_verts[200];
    D3DMATRIX matWorld_Upper;

    VERTEX lower_arm_verts[200];
    D3DMATRIX matWorld_Lower;
} ARM, *LPARM;

ARM MyArm; // This needs to be initialized.

Um den Arm zu rendern, werden zwei Renderingaufrufe ausgeführt, wie im folgenden Code gezeigt.

// Render the upper arm.
d3dDevice->SetTransform( D3DTS_WORLD, &MyArm.matWorld_Upper );
d3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, numFaces );

// Render the lower arm, updating its world matrix to articulate
// the arm by pi/4 radians (45 degrees) at the elbow.
MyArm.matWorld_Lower = RotateMyArm(MyArm.matWorld, pi/4);
d3dDevice->SetTransform( D3DTS_WORLD, &MyArm.matWorld_Lower );
d3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, numFaces );

Die folgende Abbildung ist eine Banane, die so geändert wurde, dass diese Technik verwendet wird.

Abbildung einer gemischten Banane ohne Geometriemischung

Die Unterschiede zwischen der gemischten Geometrie und der nicht gekelterten Geometrie sind offensichtlich. Dieses Beispiel ist etwas extrem. In einer realen Anwendung sind die Gelenke von segmentierten Modellen so konzipiert, dass die Nähte nicht so offensichtlich sind. Nähte sind jedoch manchmal sichtbar, was modelldesigner vor ständige Herausforderungen stellt.

Die Geometriemischung in Direct3D stellt eine Alternative zum klassischen Szenario für die segmentierte Modellierung dar. Die verbesserte visuelle Qualität von segmentierten Objekten geht jedoch auf Kosten der Übermischungsberechnungen während des Renderings. Um die Auswirkungen dieser zusätzlichen Vorgänge zu minimieren, ist die Direct3D-Geometriepipeline so optimiert, dass Geometrie mit möglichst wenig Aufwand kombiniert wird. Anwendungen, die die von Direct3D angebotenen Geometriemischungsdienste intelligent nutzen, können den Realismus ihrer Zeichen verbessern und gleichzeitig schwerwiegende Auswirkungen auf die Leistung vermeiden.

Mischen von Transformations- und Renderzuständen

Die IDirect3DDevice9::SetTransform-Methode erkennt die D3DTS_WORLD und D3DTS_WORLDn Makros, die Werten entsprechen, die vom D3DTS_WORLDMATRIX Makro definiert werden können. Diese Makros werden verwendet, um die Matrizen zu identifizieren, zwischen denen Geometrie gemischt wird.

Der aufgezählte D3DRENDERSTATETYPE-Typ enthält den D3DRS_VERTEXBLEND Renderzustand, um die Geometriemischung zu aktivieren und zu steuern. Gültige Werte für diesen Renderzustand werden durch den aufgezählten D3DVERTEXBLENDFLAGS-Typ definiert. Wenn die Geometriemischung aktiviert ist, muss das Scheitelpunktformat die entsprechende Anzahl von Mischgewichten enthalten.

Mischgewichte

Eine Mischgewichtung, manchmal als Betagewicht bezeichnet, steuert das Ausmaß, in dem eine bestimmte Weltmatrix einen Scheitelpunkt beeinflusst. Bei Mischgewichten handelt es sich um Gleitkommawerte zwischen 0,0 und 1,0, die im Vertexformat codiert sind, wobei ein Wert von 0,0 bedeutet, dass der Scheitelpunkt nicht mit dieser Matrix gemischt wird, und 1,0 bedeutet, dass der Scheitelpunkt vollständig von der Matrix beeinflusst wird.

Geometriemischungsgewichte werden im Vertexformat codiert und werden unmittelbar nach der Position für jeden Scheitelpunkt angezeigt, wie unter Fixed Function FVF Codes (Direct3D 9) beschrieben. Sie kommunizieren die Anzahl der Mischgewichte im Vertexformat, indem Sie eine der FVF-Konstanten in die Vertexbeschreibung einschließen, die Sie den Renderingmethoden bereitstellen.

Das System führt eine lineare Mischung zwischen den gewichteten Ergebnissen der Blendmatrizen durch. Die folgende Gleichung ist die vollständige Mischungsformel.

Gleichung der linearen Mischung unter Verwendung von Welttransformationsmatrizen

In der vorherigen Gleichung ist vBlend der Ausgabevertex, die v-Elemente sind die Scheitelpunkte, die von der angewendeten Weltmatrix (D3DTS_WORLDn) erzeugt werden. Die W-Elemente sind die entsprechenden Gewichtungswerte innerhalb des Scheitelpunktformats. Ein Vertex, der zwischen n Matrizen gemischt wird, kann 1 Mischgewichtungswerte aufweisen, einen für jede Mischmatrix, mit Ausnahme der letzten. Das System generiert automatisch die Gewichtung für die letzte Weltmatrix, sodass die Summe aller Gewichtungen 1,0 beträgt, ausgedrückt in der Sigma-Notation. Diese Formel kann für jeden von Direct3D unterstützten Fall vereinfacht werden, was in den folgenden Formeln gezeigt wird.

Formeln des linearen Mischens für drei Mischfälle

Dies sind die vereinfachten Formen der vollständigen Mischungsformel für die zwei, drei und vier Mischmatrixfälle.

Hinweis

Obwohl Direct3D FVF-Deskriptoren enthält, um Scheitelpunkte zu definieren, die bis zu fünf Mischgewichte enthalten, können in dieser Version von DirectX nur drei verwendet werden.

 

Weitere Informationen finden Sie in den folgenden Themen.

Vertexpipeline