Condividi tramite


Tessellation (Direct3D 9)

Unità tessellatore

L'unità tessellatore è stata migliorata. È ora possibile usarlo per:

  • Eseguire la tessellatura adattiva di tutte le primitive di ordine superiore.
  • Cercare i valori di spostamento per vertice da una mappa di spostamento e passarli a un vertex shader.
  • Supporto della tessellatura rettangolo-patch. Questa operazione viene specificata tramite una dichiarazione di vertice usando D3DDECLMETHOD_PARTIALU o D3DDECLMETHOD_PARTIALV. Se viene usata una dichiarazione di vertice contenente questi metodi per disegnare una patch triangolo, IDirect3DDevice9::D rawTriPatch avrà esito negativo. Per altre informazioni sulle dichiarazioni di vertice, vedere D3DVERTEXELEMENT9.

In DirectX 8.x, quello che è stato chiamato ORDER era davvero il grado. In Direct3D 9 il grado è ora specificato da 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; 

La modifica del tipo di grado ha interessato due altre strutture.

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; 

I driver devono correggere gli errori di compilazione risultanti da questa modifica quando vengono compilati con le nuove intestazioni. Non è necessario modificare alcuna funzionalità.

Tessellazione adattiva

La tessellatura adattiva può essere applicata alle primitive ad ordine elevato, tra cui patch N, patch rettangolo e patch triangolari. Questa funzionalità è abilitata dalla D3DRS_ENABLEADAPTIVETESSELLATION e tessella in modo adattivo una patch, in base al valore di profondità del vertice del controllo nello spazio oculare.

Le coordinate z (Zi) dei vertici di controllo (Vi), che vengono trasformate nello spazio visivo (Zieye) eseguendo un prodotto punto con un vettore 4, vengono usati come valori di profondità. Il vettore 4D (Mdm) viene specificato dall'applicazione usando quattro stati di rendering (D3DRS_ADAPTIVETESS_X, D3DRS_ADAPTIVETESS_Y, D3DRS_ADAPTIVETESS_Z e D3DRS_ADAPTIVETESS_W). Questo vettore 4 può essere la terza colonna delle matrici di visualizzazione e mondo concatenate. Può essere usato anche per applicare una scala a Zieye.

Si presuppone che la funzione per calcolare un livello di tessellazione Ti da Zieye sia (MaxTessellationLevel/Zieye), il che significa che MaxTessellationLevel è il livello di tessellazione a Z = 1 nello spazio oculare. MaxTessellationLevel è uguale a un valore impostato da IDirect3DDevice9::SetNPatchMode per N-patch e, per le patch RT, è uguale a pNumSegs. Il livello di tessellazione viene quindi bloccato sui valori, definiti dai due stati di rendering aggiuntivi D3DRS_MINTESSELLATIONLEVEL e D3DRS_MAXTESSELLATIONLEVEL, che definiscono i livelli minimo e massimo di tessellazione da bloccare. Il vertice di Ti per ogni vertice lungo un bordo di una patch viene medio per ottenere un livello di tessellazione per tale bordo. L'algoritmo per il calcolo di Ti per le patch rettangole, le patch triangolari e le patch N differiscono nei vertici di controllo usati per calcolare il livello di tessellazione.

Per le patch rettangolo con una base B-spline, vengono usati i quattro vertici del controllo più esterno. Ad esempio, con D3DORDER_CUBIC ordine: vertici (1,1) e (1,larghezza-2) vengono usati con pNumSegs[0], i vertici (1,width-2) e (height-2,height-2) vengono usati con pNumSegs[1], vertici (altezza-2,larghezza-2) e (1,larghezza-2) vengono usati con pNumSegs[2], e vertici (2,1) e (1,1) usati con pNumSegs[3].

Per le patch di triangolo, vengono usati i vertici delle patch dell'angolo. Con D3DORDER_CUBIC ordine: i vertici (0) e (9) vengono usati con pNumSegs[0], i vertici (9) e (6) vengono usati con pNumSegs[1] e vertici (6) e (0) vengono usati con pNumSegs[3].

Per le patch N vengono usati i vertici del triangolo.

Per le patch rettangolo e triangolo con base Bezier, vengono usati i vertici del controllo angolo.

Controllo della frequenza di tessellazione per vertice. Un'applicazione può facoltativamente fornire un singolo valore a virgola mobile positiva per vertice, che può essere usato per controllare la frequenza di tessellazione. Viene fornito usando il D3DDECLUSAGE_TESSFACTOR, per il quale l'indice di utilizzo deve essere 0 e il tipo di input deve essere D3DDECLTYPE_FLOAT1. Questo valore viene moltiplicato al livello di tessellazione per vertice.

Math

Il livello di tessellazione (Te) per un bordo e, rappresentato da due vertici di controllo (Ve1, Ve2), viene calcolato come illustrato di seguito:

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 

Quando D3DRS_ENABLEADAPTIVETESSELLATION è TRUE, le primitive triangolari (elenchi triangoli, fan, strip) vengono disegnate come N patch, IDirect3DDevice9::SetNPatchMode ha valore impostato minore di 1,0.

Modifiche all'API

Nuovi stati di rendering:

 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 

E i relativi valori predefiniti:

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 

Nuovi limiti hardware:

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

Pipeline del vertice