Mosaik (Direct3D 9)
Mosaikeinheit
Die Mosaikeinheit wurde verbessert. Sie können sie jetzt für Dies verwenden:
- Führen Sie ein adaptives Mosaik aller primitiven Typen höherer Ordnung aus.
- Suchen Sie die Verschiebungswerte pro Scheitelpunkt aus einer Verschiebungszuordnung, und übergeben Sie sie an einen Vertex-Shader.
- Unterstützung des Mosaiks für Rechteckpatches. Dies wird durch eine Scheitelpunktdeklaration mit D3DDECLMETHOD _ PARTIALU oder D3DDECLMETHOD _ PARTIALV angegeben. Wenn eine Scheitelpunktdeklaration, die diese Methoden enthält, zum Zeichnen eines Dreieckspatches verwendet wird, erzeugt IDirect3DDevice9::D rawTriPatch einen Fehler. Weitere Informationen zu Scheitelpunktdeklarationen finden Sie unter D3DVERTEXELEMENT9.
In DirectX 8.x war order tatsächlich 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 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 sich aus dieser Änderung ergeben, wenn sie mit den neuen Headern kompiliert werden. Es muss keine Funktionalität geändert werden.
Adaptive Mosaik
Adaptive Mosaik kann auf hochwertige Primitive angewendet werden, einschließlich N-Patches, Rechteckpatches und Dreieckspatches. Dieses Feature wird durch die D3DRS ENABLEADAPTIVETESSELLATION aktiviert und mosaikiert einen Patch basierend auf dem Tiefenwert des Steuervertex im _ Augenbereich.
Die Z-Koordinaten (Zi) von Kontrollvertices (Vi), die durch Ausführen eines Punktprodukts mit einem 4-Vektor in den Augenbereich (Zieye) transformiert werden, werden als Tiefenwerte verwendet. Der 4D-Vektor (Mdm) wird von der Anwendung mit vier Renderzuständen angegeben (D3DRS _ ADAPTIVETESS _ X, D3DRS _ ADAPTIVETESS _ Y, D3DRS _ ADAPTIVETESS Z und _ D3DRS _ ADAPTIVETESS _ W). Dieser 4-Vektor könnte die dritte Spalte der verketteten Welt und ansichtsmatrizen sein. Sie kann auch verwendet werden, um eine Skalierung auf Zieye anzuwenden.
Die Funktion zum Berechnen einer Mosaikebene Ti von Zieye wird als (MaxTessellationLevel/Zieye) angenommen. Dies bedeutet, dass MaxTessellationLevel die Mosaikebene bei Z = 1 im Augenbereich ist. MaxTessellationLevel entspricht einem Wert, der von IDirect3DDevice9::SetNPatchMode für N-Patches festgelegt wurde, und bei RT-Patches gleich pNumSegs. Die Mosaikebene wird dann an Werte geklammert, die durch die beiden zusätzlichen Renderzustände D3DRS _ MINTESSELLATIONLEVEL und D3DRS MAXTESSELLATIONLEVEL definiert werden, die die minimalen und maximalen Mosaikebenen definieren, an die klammert werden _ soll. Die Ti-Dateien für jeden Scheitelpunkt an einem Rand eines Patches werden gemittelt, um eine Mosaikebene für diese Kante zu erhalten. Der Algorithmus zum Berechnen von Ti für Rechteckpatches, Dreieckspatches und N-Patches unterscheidet sich in dem, welche Steuervertices zum Berechnen der Mosaikebene verwendet werden.
Für rechteckige Patches mit einer B-Spline-Basis werden die vier äußersten Kontrollvertices verwendet. Beispiel: mit D3DORDER _ CUBIC-Reihenfolge: Vertices (1,1) und (1,width-2) werden mit pNumSegs [ ] 0, Vertices (1,width-2) und (height-2,height-2) mit pNumSeg verwendet. 1 , Scheitelstriche [ ] (Höhe-2, Breite-2) und (1, Breite-2) werden mit pNumSegs 2 verwendet, und Scheiteltische [ ] (2,1) und (1,1) werden mit pNumSegs [ 3 ] verwendet.
Für die Dreieckspatches werden die Eckpatchvertices verwendet. Bei der D3DORDER-KUBIK-Reihenfolge: Scheitelungen _ (0) und (9) werden mit pNumSegs 0 verwendet, Scheitelungen [ ] (9) und (6) werden mit pNumSegs 1 und Scheitelungen [ ] (6) und (0) mit pNumSegs [ 3 ] verwendet.
Für N-Patches werden die Dreiecksvertices verwendet.
Für die Rechteck- und Dreieckspatches mit einer Bézierbasis werden die Ecksteuerpunkte verwendet.
Steuerung der Mosaikrate pro Scheitelpunkt. Eine Anwendung kann optional einen einzelnen positiven Gleitkommawert pro Scheitelpunkt zur Steuerung der Mosaikrate verwenden. Dies wird mithilfe des D3DDECLUSAGE TESSFACTOR bereitgestellt, für den der Verwendungsindex 0 und der Eingabetyp _ D3DDECLTYPE _ FLOAT1 sein muss. Dies wird mit der Mosaikebene pro Scheitelpunkt multipliziert.
Mathematik
Die Mosaikebene (Te) für eine Kante e, dargestellt durch zwei Steuerelementvertices (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 Dreiecksprimitiven (Dreieckslisten, Lüfter, Strips) 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 ihre 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-Caps:
D3DDEVCAPS2_ADAPTIVETESSRTPATCH // Can adaptively tessellate RT-patches
D3DDEVCAPS2_ADAPTIVETESSNPATCH // Can adaptively tessellate N-patches