Condividi tramite


Tassellatura (Direct3D 9)

Unità tassellatore

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

  • Eseguire la tassellatura 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 tassellatura 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 di triangolo, IDirect3DDevice9::D rawTriPatch avrà esito negativo. Per altre informazioni sulle dichiarazioni dei vertici, vedere D3DVERTEXELEMENT9.

In DirectX 8.x, quello che è stato chiamato ORDER era davvero il grado. In Direct3D 9 il grado viene 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 altre due 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 durante la compilazione con le nuove intestazioni. Non è necessario modificare alcuna funzionalità.

Tassellatura adattiva

La tassellatura adattiva può essere applicata a primitive di ordine elevato, tra cui patch N, patch rettangolo e patch di triangolo. Questa funzionalità è abilitata dal D3DRS_ENABLEADAPTIVETESSELLATION e tassella in modo adattivo una patch, in base al valore di profondità del vertice di controllo nello spazio oculare.

Le coordinate z (Zi) dei vertici di controllo (Vi), che vengono trasformate nello spazio oculare (Zieye) eseguendo un prodotto punto con un vettore a 4, vengono usate 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 potrebbe essere la terza colonna delle matrici di visualizzazione e mondo concatenate. Può anche essere usato per applicare una scala a Zieye.

Si presuppone che la funzione per calcolare un livello di tassellatura Ti da Zieye sia (MaxTessellationLevel/Zieye), il che significa che MaxTessellationLevel è il livello di tassellatura a Z = 1 nello spazio oculare. MaxTessellationLevel è uguale a un valore impostato da IDirect3DDevice9::SetNPatchMode per le patch N e, per le patch RT, è uguale a pNumSegs. Il livello di tassellatura viene quindi bloccato sui valori, definiti dai due stati di rendering aggiuntivi D3DRS_MINTESSELLATIONLEVEL e D3DRS_MAXTESSELLATIONLEVEL, che definiscono i livelli di tassellatura minimo e massimo a cui essere bloccati. Il ti per ogni vertice lungo un bordo di una patch viene mediato per ottenere un livello di tassellatura per quel bordo. L'algoritmo per il calcolo di Ti per patch rettangoli, patch di triangolo e patch N differisce in base ai vertici di controllo usati per calcolare il livello di tassellatura.

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

Per le patch di triangolo, vengono usati i vertici della 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 i rettangoli e i triangoli con una base di Bézier, vengono usati i vertici del controllo angolo.

Controllo della velocità a mosaico 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 tassellatura. Viene fornito usando il D3DDECLUSAGE_TESSFACTOR, per cui l'indice di utilizzo deve essere 0 e il tipo di input deve essere D3DDECLTYPE_FLOAT1. Questo valore viene moltiplicato per il livello a mosaico per vertice.

Matematica

Il livello di tassellatura (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 di triangolo (elenchi di triangoli, fan, strisce) vengono disegnate come N patch, IDirect3DDevice9::SetNPatchMode ha valore impostato minore di 1,0.

Modifiche 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 

della pipeline dei vertici