Tessellation (Direct3D 9)

Tessellator-Einheit

Die Tessellatoreinheit wurde erweitert. Sie können es jetzt für Folgendes verwenden:

  • Führen Sie adaptive Tessellation aller Primitiven höherer Ordnung durch.
  • Suchen Sie nach Verschiebungswerten pro Scheitelpunkt aus einer Verschiebungskarte, und übergeben Sie sie an einen Vertex-Shader.
  • Unterstützung von Rechteck-Patch-Tessellation. Dies wird durch eine Scheitelpunktdeklaration mit D3DDECLMETHOD_PARTIALU oder D3DDECLMETHOD_PARTIALV angegeben. Wenn eine Vertexdeklaration mit diesen Methoden verwendet wird, um einen Dreieckspatch zu zeichnen, schlägt IDirect3DDevice9::D rawTriPatch fehl. Weitere Informationen zu Scheitelpunktdeklarationen finden Sie unter D3DVERTEXELEMENT9.

In DirectX 8.x war das, was ORDER genannt wurde, wirklich der Grad. In Direct3D 9 wird der Grad jetzt durch D3DDEGREETYPE angegeben.

 // This used to be D3DORDERTYPE and D3DORDER* 
 typedef enum _D3DDEGREETYPE 
 { 
 D3DDEGREE_LINEAR = 1, 
 D3DDEGREE_QUADRATIC = 2, 
 D3DDEGREE_CUBIC = 3, 
 D3DDEGREE_QUINTIC = 5, 
 D3DDEGREE_FORCE_DWORD = 0x7fffffff, 
 } D3DDEGREETYPE; 

Die Änderung des Gradtyps betraf zwei weitere Strukturen.

typedef struct _D3DRECTPATCH_INFO 
 { 
 UINT StartVertexOffsetWidth; 
 UINT StartVertexOffsetHeight; 
 UINT Width; 
 UINT Height; 
 UINT Stride; 
 D3DBASISTYPE Basis; 
 D3DDEGREETYPE Degree; 
 } D3DRECTPATCH_INFO; 
 typedef struct _D3DTRIPATCH_INFO 
 { 
 UINT StartVertexOffset; 
 UINT NumVertices; 
 D3DBASISTYPE Basis; 
 D3DDEGREETYPE Degree; 
 } D3DTRIPATCH_INFO; 

Treiber müssen Kompilierungsfehler beheben, die sich aus dieser Änderung ergeben, wenn sie mit den neuen Headern kompilieren. Es muss keine Funktionalität geändert werden.

Adaptive Tessellation

Adaptive Tessellation kann auf Grundtypen hoher Ordnung angewendet werden, einschließlich N-Patches, Rechteck-Patches und Dreieckspatches. Dieses Feature wird durch die D3DRS_ENABLEADAPTIVETESSELLATION aktiviert und adaptiv tesseliert einen Patch basierend auf dem Tiefenwert des Steuervertex im Augenraum.

Als Tiefenwerte werden die Z-Koordinaten (Zi) von Kontrollvertices (Vi) verwendet, die durch Ausführen eines Punktprodukts mit einem 4-Vektor in den Augenraum (Zieye) transformiert werden. Der 4D-Vektor (Mdm) wird von der Anwendung mit vier Renderzuständen (D3DRS_ADAPTIVETESS_X, D3DRS_ADAPTIVETESS_Y, D3DRS_ADAPTIVETESS_Z und D3DRS_ADAPTIVETESS_W) angegeben. Dieser 4-Vektor könnte die dritte Spalte der verketteten Welt- und Sichtmatrizen sein. Es könnte auch verwendet werden, um eine Skala auf Zieye anzuwenden.

Die Funktion zum Berechnen einer Tessellationsebene Ti von Zieye wird als (MaxTessellationLevel/Zieye) angenommen, was bedeutet, dass der MaxTessellationLevel die Tessellationsebene bei Z = 1 im Augenraum ist. MaxTessellationLevel entspricht einem Wert, der von IDirect3DDevice9::SetNPatchMode für N-Patches festgelegt wurde, und ist für RT-Patches gleich pNumSegs. Die Tessellationsebene wird dann an Werte geklemmt, die durch die beiden zusätzlichen Renderzustände D3DRS_MINTESSELLATIONLEVEL und D3DRS_MAXTESSELLATIONLEVEL definiert werden, die die minimalen und maximalen Tessellationsstufen definieren, an die geklemmt werden sollen. Die Ti's für jeden Scheitelpunkt entlang einer Kante eines Patches werden gemittelt, um eine Tessellationsebene für diesen Rand zu erhalten. Der Algorithmus zum Berechnen von Ti für Rechteck-Patches, Dreieckspatches und N-Patches unterscheidet sich darin, welche Steuerelementvertices zum Berechnen der Tessellationsebene verwendet werden.

Für die Rechteck-Patches mit B-spline-Basis werden die vier äußersten Regelvertices verwendet. Beispiel: mit D3DORDER_CUBIC Reihenfolge: Scheitelpunkte (1,1) und (1,Width-2) werden mit pNumSegs[0], Scheitelpunkten (1,Breite-2) und (Höhe-2,Höhe-2) mit pNumSegs[1], Scheitelpunkte (Höhe-2,Breite-2) und (1,Breite-2) werden mit pNumSegs[2] und Scheitelpunkte (2,1) und (1,1) mit pNumSegs[3] verwendet.

Für die Dreieckspatches werden die Eckpunktpunkte verwendet. Mit D3DORDER_CUBIC Reihenfolge: Scheitelpunkte (0) und (9) werden mit pNumSegs[0], Scheitelpunkte (9) und (6) mit pNumSegs[1] und Sctices (6) und (0) mit pNumSegs[3] verwendet.

Für N-Patches werden die Dreieckspunkte verwendet.

Für das Rechteck und dreieckige Patches mit einer Bézier-Basis werden die Eckpunkt-Regel-Scheitelpunkte verwendet.

Steuerung der Tessellationsrate pro Vertex. Eine Anwendung kann optional einen einzelnen positiven Gleitkommawert pro Scheitelpunkt bereitstellen, mit dem die Tessellationsrate gesteuert werden kann. Dies wird mithilfe der D3DDECLUSAGE_TESSFACTOR bereitgestellt, für die der Verwendungsindex 0 und der Eingabetyp D3DDECLTYPE_FLOAT1 sein muss. Dies wird mit der Tessellationsebene pro Vertex multipliziert.

Mathematik

Die Tessellationsebene (Te) für einen Edge e, dargestellt durch zwei Steuervertices (Ve1, Ve2), wird wie unten dargestellt berechnet:

Vertex Vi: (Xi, Yi, Zi, TFactori (optional)). 
Ze1eye = Ve1 . Mdm 
Ze2eye = Ve2 . Mdm 
Te1 = MaxTessellationLevel * TFactore1 / Ze1eye 
Te2 = MaxTessellationLevel * TFactore2 / Ze2eye 
Te = ( Te1 + Te2 ) / 2; 
if Te > D3DRS_MAXTESSELLATIONLEVEL || Te < 0, then Te = D3DRS_MAXTESSELLATIONLEVEL 
if Te < D3DRS_MINTESSELLATIONLEVEL, then Te = D3DRS_MINTESSELLATIONLEVEL 

Wenn D3DRS_ENABLEADAPTIVETESSELLATION TRUE ist, werden Dreiecksgrundtypen (Dreieckslisten, Lüfter, Streifen) als N-Patches gezeichnet, IDirect3DDevice9::SetNPatchMode hat einen Wert kleiner als 1,0 festgelegt.

API-Änderungen

Neue Renderzustände:

 D3DRS_ENABLEADAPTIVETESSELLATION // BOOL 
 D3DRS_MAXTESSELLATIONLEVEL       // Float 
 D3DRS_MINTESSELLATIONLEVEL       // Float 
 D3DRS_ADAPTIVETESS_X             // Float 
 D3DRS_ADAPTIVETESS_Y             // Float 
 D3DRS_ADAPTIVETESS_Z             // Float 
 D3DRS_ADAPTIVETESS_W             // Float 
 
 // D3DRS_MINTESSELLATIONLEVEL and D3DRS_MAXTESSELLATIONLEVEL 
 // cannot be less than 1 

Und deren Standardwerte:

D3DRS_MAXTESSELLATIONLEVEL = 1.0f 
D3DRS_MINTESSELLATIONLEVEL = 1.0f 
D3DRS_ADAPTIVETESS_X = 0.0f 
D3DRS_ADAPTIVETESS_Y = 0.0f 
D3DRS_ADAPTIVETESS_Z = 1.0f 
D3DRS_ADAPTIVETESS_W = 0.0f 
D3DRS_ENABLEADAPTIVETESSELLATION = FALSE 

Neue Hardware-Obergrenzen:

D3DDEVCAPS2_ADAPTIVETESSRTPATCH // Can adaptively tessellate RT-patches 
D3DDEVCAPS2_ADAPTIVETESSNPATCH  // Can adaptively tessellate N-patches 

Vertexpipeline