Tessellation (Direct3D 9)
Tessellator Unit
De tessellator-eenheid is verbeterd. U kunt deze nu gebruiken voor het volgende:
- Adaptieve tesselatie van alle primitieven van hogere volgorde uitvoeren.
- Zoek per hoekpuntverplaatsingswaarden van een verplaatsingskaart en geef deze door aan een hoekpunt-shader.
- Ondersteuning voor rechthoek-patch tessellation. Dit wordt opgegeven via een hoekpuntdeclaratie met behulp van D3DDECLMETHOD_PARTIALU of D3DDECLMETHOD_PARTIALV. Als een hoekpuntdeclaratie met deze methoden wordt gebruikt om een driehoekspatch te tekenen, mislukt IDirect3DDevice9::D rawTriPatch-. Zie D3DVERTEXELEMENT9voor meer informatie over hoekpuntdeclaraties.
In DirectX 8.x, wat order werd genoemd, was echt de graad. In Direct3D 9 wordt de graad nu opgegeven door D3DDEGREETYPE.
// 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;
De wijziging in gradentype heeft twee andere structuren beïnvloed.
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;
Stuurprogramma's moeten compilatiefouten oplossen die het gevolg zijn van deze wijziging wanneer ze worden gecompileerd met de nieuwe headers. Er hoeft geen functionaliteit te worden gewijzigd.
Adaptieve tesselatie
Adaptieve tesselatie kan worden toegepast op primitieven in hoge volgorde, waaronder N-patches, rechthoekpatches en driehoekspatches. Deze functie wordt ingeschakeld door de D3DRS_ENABLEADAPTIVETESSELLATION en adaptief een patch tesselen, op basis van de dieptewaarde van het besturingspunt in de oogruimte.
De z-coördinaten (Zi) van besturingspunten (Vi), die worden getransformeerd in de ruimte van het oog (Zieye) door een puntproduct met een 4-vector uit te voeren, worden gebruikt als dieptewaarden. De 4D-vector (Mdm) wordt door de toepassing opgegeven met behulp van vier renderstatussen (D3DRS_ADAPTIVETESS_X, D3DRS_ADAPTIVETESS_Y, D3DRS_ADAPTIVETESS_Z en D3DRS_ADAPTIVETESS_W). Deze 4-vector kan de derde kolom van de samengevoegde wereld zijn en matrices weergeven. Het kan ook worden gebruikt om een schaal toe te passen op Zieye.
De functie voor het berekenen van een tesselatieniveau Ti van Zieye wordt verondersteld (MaxTessellationLevel/Zieye) te zijn, wat betekent dat maxTessellationLevel het tesselatieniveau is op Z = 1 in de ruimte in het oog. MaxTessellationLevel is gelijk aan een waarde die is ingesteld door IDirect3DDevice9::SetNPatchMode voor N-patches en voor RT-patches is deze gelijk aan pNumSegs. Het tesselatieniveau wordt vervolgens vastgeklemd op waarden, gedefinieerd door de twee extra renderstatussen D3DRS_MINTESSELLATIONLEVEL en D3DRS_MAXTESSELLATIONLEVEL, waarmee de minimum- en maximumtesselatieniveaus worden gedefinieerd waarop moet worden geklemd. De Ti's voor elk hoekpunt langs een rand van een patch worden gemiddeld berekend om een tesselatieniveau voor die rand te verkrijgen. Het algoritme voor het berekenen van Ti voor rechthoekpatches, driehoekpatches en N-patches verschilt in welke besturingspunten worden gebruikt voor het berekenen van het niveau van de tesselatie.
Voor de rechthoekpatches met een B-splinebasis worden de vier buitenste hoekpunten gebruikt. Met D3DORDER_CUBIC volgorde: hoekpunten (1,1) en (1,breedte-2) worden bijvoorbeeld gebruikt met pNumSegs[0], Hoekpunten (1,breedte-2) en (hoogte-2,hoogte-2) worden gebruikt met pNumSegs[1], hoekpunten (hoogte-2, breedte-2) en (1,breedte-2) worden gebruikt met pNumSegs[2] en hoekpunten (2,1) en (1,1) worden gebruikt met pNumSegs[3].
Voor de driehoekspatches worden de hoekpunten gebruikt. Met D3DORDER_CUBIC volgorde: hoekpunten (0) en (9) worden gebruikt met pNumSegs[0], hoekpunten (9) en (6) worden gebruikt met pNumSegs[1] en hoekpunten (6) en (0) worden gebruikt met pNumSegs[3].
Voor N-patches worden de driehoekpunten gebruikt.
Voor de rechthoek- en driehoekspatches met een Bezier-basis worden de hoekpunten gebruikt.
Controle per hoekpuntsnelheid. Een toepassing kan eventueel één positieve drijvendekommagetalwaarde per hoekpunt opgeven, die kan worden gebruikt om de snelheid van de tessellation te beheren. Dit wordt geleverd met behulp van de D3DDECLUSAGE_TESSFACTOR, waarvoor de gebruiksindex 0 moet zijn en het invoertype moet worden D3DDECLTYPE_FLOAT1. Dit wordt vermenigvuldigd met het per hoekpunt tesselatieniveau.
Wiskunde
Het tesselatieniveau (Te) voor een rand e, vertegenwoordigd door twee besturingspunten (Ve1, Ve2), wordt berekend zoals hieronder wordt weergegeven:
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
Wanneer D3DRS_ENABLEADAPTIVETESSELLATION is TRUE, worden driehoekprimitieven (driehoeklijsten, ventilatoren, stroken) getekend als N-patches, IDirect3DDevice9::SetNPatchMode de waarde kleiner dan 1,0 heeft ingesteld.
API-wijzigingen
Nieuwe renderstatussen:
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
En de standaardwaarden:
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
Nieuwe hardwarelimieten:
D3DDEVCAPS2_ADAPTIVETESSRTPATCH // Can adaptively tessellate RT-patches
D3DDEVCAPS2_ADAPTIVETESSNPATCH // Can adaptively tessellate N-patches
Verwante onderwerpen