Tessellation (Direct3D 9)
Tessellator-Einheit
Die Tessellatoreinheit wurde verbessert. Sie können es jetzt für Folgendes verwenden:
- Führen Sie adaptive Tessellation aller Grundtypen mit höherer Reihenfolge aus.
- Suchen Sie nach Vertexverschiebungswerten aus einer Verdrängungskarte, und übergeben Sie sie an einen Vertex-Shader.
- Unterstützung der Rechteck-Patch-Tessellation. Dies wird über eine Vertexdeklaration mithilfe von D3DDECLMETHOD_PARTIALU oder D3DDECLMETHOD_PARTIALV angegeben. Wenn eine Vertexdeklaration, die diese Methoden enthält, verwendet wird, um einen Dreieckspatch zu zeichnen, schlägt IDirect3DDevice9::D rawTriPatch- fehl. Weitere Informationen zu Vertexdeklarationen finden Sie unter D3DVERTEXELEMENT9.
In DirectX 8.x war der so genannte ORDER wirklich der Grad. In Direct3D 9 wird der Grad jetzt durch D3DDEGREETYPEangegeben.
// 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 hat zwei andere Strukturen beeinflusst.
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 aus dieser Änderung resultieren, wenn sie mit den neuen Headern kompiliert werden. Es muss keine Funktionalität geändert werden.
Adaptive Tessellation
Adaptive Tessellation kann auf Grundtypen mit hoher Reihenfolge angewendet werden, einschließlich N-Patches, Rechteckpatches und Dreieckspatches. Dieses Feature wird durch die D3DRS_ENABLEADAPTIVETESSELLATION aktiviert und ein Patch basierend auf dem Tiefenwert des Steuervertex im Blickbereich adaptiv tesseliert.
Die Z-Koordinaten (Zi) von Kontrollvertices (Vi), die in den Augenraum (Zieye) umgewandelt werden, indem ein Punktprodukt mit einem 4-Vektor ausgeführt wird, werden als Tiefenwerte verwendet. Der 4D-Vektor (Mdm) wird von der Anwendung mithilfe von 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 Ansichtsmatrizen sein. Es könnte auch verwendet werden, um eine Skala auf Zieye anzuwenden.
Die Funktion zum Berechnen einer Tessellationsstufe Ti von Zieye wird als (MaxTessellationLevel/Zieye) angenommen, was bedeutet, dass das MaxTessellationLevel die Tessellationsebene bei Z = 1 im Augenraum ist. Der MaxTessellationLevel ist gleich einem Wert, der von IDirect3DDevice9::SetNPatchMode für N-Patches festgelegt wird und für RT-Patches gleich pNumSegs ist. Die Tessellationsebene wird dann an Werte geklemmt, definiert durch die beiden zusätzlichen Renderzustände D3DRS_MINTESSELLATIONLEVEL und D3DRS_MAXTESSELLATIONLEVEL, die die minimalen und maximalen Tessellationsebenen definieren, an die geklemmt werden soll. Die Tis für jeden Scheitelpunkt entlang eines Kantes eines Patches werden durchschnittliche Mittelwert für die Tessellationsebene für diesen Rand. Der Algorithmus zum Berechnen von Ti für Rechteckpatches, Dreieckspatches und N-Patches unterscheidet sich in der Berechnung der Tessellationsebene.
Für die Rechteck-Patches mit einer B-Spline-Basis werden die vier äußersten Kontrollvertizes verwendet. Beispiel: mit D3DORDER_CUBIC Reihenfolge: Scheitelpunkte (1,1) und (1,breite-2) werden mit pNumSegs[0], Scheitelpunkten (1,Breite-2) und (Höhe-2,Höhe-2) mit pNumSegs verwendet[[1], Scheitelpunkte (Höhe-2,Breite-2) und (1,Breite-2) werden mit pNumSegs[2] und Scheitelpunkten (2,1) und (1,1) mit pNumSegs[3] verwendet.
Für die Dreieckspatches werden die Eckpatch-Scheitelpunkte verwendet. Mit D3DORDER_CUBIC Reihenfolge: Scheitelpunkte (0) und (9) werden mit pNumSegs[0], Scheitelpunkten (9) und (6) mit pNumSegs[1] und Scheitelpunkten (6) und (0) mit pNumSegs[3] verwendet.
Für N-Patches werden die Dreiecksvertizes verwendet.
Für das Rechteck und dreieckige Patches mit einer Bézier-Basis werden die Ecksteuerelement-Scheitelpunkte verwendet.
Steuerung der Tesselationsrate pro Vertex. Eine Anwendung kann optional einen einzelnen positiven Gleitkommawert pro Scheitelpunkt angeben, der zur Steuerung der Tessellationsrate verwendet werden kann. Dies wird mithilfe der D3DDECLUSAGE_TESSFACTOR bereitgestellt, für die der Verwendungsindex 0 sein muss, und der Eingabetyp muss D3DDECLTYPE_FLOAT1 werden. Dies wird auf die Pro-Vertex-Tessellationsebene multipliziert.
Mathe
Die Tessellationsebene (Te) für einen Rand e, dargestellt durch zwei Kontrollverknörtelungen (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 TRUEist, werden Dreiecksgrundtypen (Dreieckslisten, Fächer, Streifen) als N-Patches gezeichnet, IDirect3DDevice9::SetNPatchMode hat den 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 Hardwarekappen:
D3DDEVCAPS2_ADAPTIVETESSRTPATCH // Can adaptively tessellate RT-patches
D3DDEVCAPS2_ADAPTIVETESSNPATCH // Can adaptively tessellate N-patches
Verwandte Themen