Mapping dei codici FVF a una dichiarazione Direct3D 9 (Direct3D 9)
Questa tabella esegue il mapping dei codici FVF a una struttura D3DVERTEXELEMENT9 .
FVF | Tipo di dati | Utilizzo | Indice di utilizzo |
---|---|---|---|
D3DFVF_XYZ | D3DDECLTYPE_FLOAT3 | D3DDECLUSAGE_POSITION | 0 |
D3DFVF_XYZRHW | D3DDECLTYPE_FLOAT4 | D3DDECLUSAGE_POSITIONT | 0 |
D3DFVF_XYZW | D3DDECLTYPE_FLOAT4 | D3DDECLUSAGE_POSITION | 0 |
D3DFVF_XYZB5 e D3DFVF_LASTBETA_UBYTE4 | D3DVSDT_FLOAT3, D3DVSDT_FLOAT4, D3DVSDT_UBYTE4 | D3DDECLUSAGE_POSITION, D3DDECLUSAGE_BLENDWEIGHT, D3DDECLUSAGE_BLENDINDICES | 0 |
D3DFVF_XYZB5 e D3DFVF_LASTBETA_D3DCOLOR | D3DVSDT_FLOAT3, D3DVSDT_FLOAT4, D3DVSDT_D3DCOLOR | D3DDECLUSAGE_POSITION, D3DDECLUSAGE_BLENDWEIGHT, D3DDECLUSAGE_BLENDINDICES | 0 |
D3DFVF_XYZB5 | D3DDECLTYPE_FLOAT3, D3DDECLTYPE_FLOAT4, D3DDECLTYPE_FLOAT1 | D3DDECLUSAGE_POSITION, D3DDECLUSAGE_BLENDWEIGHT, D3DDECLUSAGE_BLENDINDICES | 0 |
D3DFVF_XYZBn (n=1..4) | D3DDECLTYPE_FLOAT3, D3DDECLTYPE_FLOATn | D3DDECLUSAGE_POSITION, D3DDECLUSAGE_BLENDWEIGHT | 0 |
D3DFVF_XYZBn (n=1..4) e D3DFVF_LASTBETA_UBYTE4 | D3DDECLTYPE_FLOAT3, D3DDECLTYPE_FLOAT(n-1), D3DDECLTYPE_UBYTE4 | D3DDECLUSAGE_POSITION, D3DDECLUSAGE_BLENDWEIGHT, D3DDECLUSAGE_BLENDINDICES | 0 |
D3DFVF_XYZBn (n=1..4) e D3DFVF_LASTBETA_D3DCOLOR | D3DDECLTYPE_FLOAT3, D3DDECLTYPE_FLOAT(n-1), D3DDECLTYPE_D3DCOLOR | D3DDECLUSAGE_POSITION, D3DDECLUSAGE_BLENDWEIGHT, D3DDECLUSAGE_BLENDINDICES | 0 |
D3DFVF_NORMAL | D3DDECLTYPE_FLOAT3 | D3DDECLUSAGE_NORMAL | 0 |
D3DFVF_PSIZE | D3DDECLTYPE_FLOAT1 | D3DDECLUSAGE_PSIZE | 0 |
D3DFVF_DIFFUSE | D3DDECLTYPE_D3DCOLOR | D3DDECLUSAGE_COLOR | 0 |
D3DFVF_SPECULAR | D3DDECLTYPE_D3DCOLOR | D3DDECLUSAGE_COLOR | 1 |
D3DFVF_TEXCOORDSIZEm(n) | D3DDECLTYPE_FLOATm | D3DDECLUSAGE_TEXCOORD | n |
Dichiarazioni di vertice con D3DDECLUSAGE_POSITIONT
La presenza di un elemento vertex con (D3DUSAGE_POSITIONT, 0) viene usata per indicare al dispositivo che i dati del vertice in arrivo sono già stati attraverso l'elaborazione dei vertici (ad esempio un FVF con D3DFVF_XYZRHW set di bit). In fase di disegno, se la dichiarazione attualmente impostata ha un elemento con la semantica (D3DUSAGE_POSITIONT, 0), l'intera elaborazione del vertice viene ignorata (come se sia stato impostato un FVF con D3DFVF_XYZRHW bit).
Esistono alcune restrizioni per le dichiarazioni di vertice con (D3DDECLUSAGE_POSITIONT, 0):
- È possibile usare solo lo zero di flusso in tali dichiarazioni.
- Gli elementi vertex devono essere ordinati aumentando l'offset del flusso.
- L'offset del flusso deve essere allineato AWORD.
- La stessa coppia (Utilizzo, Indice di utilizzo) deve essere elencata una sola volta.
- È possibile usare solo il metodo D3DDECLMETHOD_DEFAULT.
- Altri elementi del vertice non possono avere la semantica (D3DDECLUSAGE_POSITION, 0).
Inoltre, esistono alcune restrizioni relative a tale dichiarazione correlata alla versione del driver del dispositivo. Queste restrizioni sono effettive perché Direct3D invia tali dichiarazioni direttamente al driver senza eseguire alcuna conversione.
Dichiarazioni di vertice senza D3DDECLUSAGE_POSITIONT
Il runtime convalida la creazione di dichiarazioni. Di seguito sono riportate le regole generali per le dichiarazioni legali.
- Tutti gli elementi del vertice per un flusso devono essere consecutivi e ordinati in base all'offset.
- L'offset del flusso deve essere allineato AWORD.
- La stessa coppia (Utilizzo, Indice di utilizzo) deve essere elencata una sola volta.
- Se la D3DDEVCAPS2_VERTEXELEMENTSCANSHARESTREAMOFFSET è impostata,
- Più elementi del vertice possono condividere lo stesso offset in un flusso.
- Gli elementi del vertice possono essere tutti di tipi diversi che possono essere di dimensioni diverse.
- Gli elementi del vertice possono sovrapporsi arbitrariamente. Ad esempio, un elemento può iniziare in una posizione di un flusso che è, allo stesso tempo, al centro di un altro elemento.
- Gli elementi vertex possono avere l'offset del flusso in qualsiasi ordine.
- Il numero di elementi del vertice non può essere maggiore di 64.
- UsageIndex deve trovarsi nell'intervallo [0-15].
- Dichiarazione, usata con l'API DrawPrimitive, non deve avere elementi di vertice diversi da D3DDECLMETHOD_DEFAULT, D3DDECLMETHOD_LOOKUPPRESAMPLED o D3DDECLMETHOD_LOOKUP.
- La dichiarazione, che contiene D3DDECLMETHOD_LOOKUP o LOOKUPPRESAMPLED, deve essere usata solo con la pipeline del vertice programmabile.
- Dichiarazione, usata con l'API DrawRectPatch/DrawTriPatch, non può avere elementi di vertice con D3DDECLMETHOD_LOOKUPPRESAMPLED o D3DDECLMETHOD_LOOKUP.
- La dichiarazione deve avere un solo elemento con D3DDECLMETHOD_LOOKUP o D3DDECLMETHOD_LOOKUPPRESAMPLED metodo.
- La dichiarazione con D3DDECLMETHOD_LOOKUP o D3DDECLMETHOD_LOOKUPPRESAMPLED non deve avere elementi diversi da D3DDECLMETHOD_DEFAULT, perché il mapping di spostamento viene eseguito solo per le patch N.
- Gli elementi vertex con D3DDECLMETHOD_LOOKUP o D3DDECLMETHOD_LOOKUPPRESAMPLED possono essere usati solo con la semantica (D3DDECLUSAGE_SAMPLE, n) e viceversa.
- Se un elemento vertice con D3DDECLMETHOD_LOOKUP metodo ha un indice di flusso e un offset di un elemento del vertice già esistente, questo elemento vertex deve avere lo stesso tipo di dati.
- Un elemento vertice con il metodo D3DDECLMETHOD_LOOKUP deve avere il tipo di dati D3DDECLTYPE_FLOAT2/3/4
- Gli elementi vertex con tipi D3DDECLMETHOD_CROSSUV, D3DDECLMETHOD_PARTIALU e D3DDECLMETHOD_PARTIALV devono avere un offset di un elemento vertice con un tipo di dati compatibile.
- Un elemento vertice con il metodo D3DDECLMETHOD_UV o D3DDECLMETHOD_LOOKUPPRESAMPLED deve avere tipo D3DDECLTYPE_UNUSED, indice di flusso zero e offset di flusso zero.
- Le dichiarazioni con metodi D3DDECLMETHOD_UV, D3DDECLMETHOD_PARTIALU e D3DDECLMETHOD_PARTIALV possono essere usate solo con DrawRectPatch.
- L'utilizzo D3DDECLUSAGE_TESSFACTOR deve essere usato solo con il tipo di dati D3DDECLTYPE_FLOAT1 e l'indice di utilizzo 0.
- Quando viene usata una dichiarazione per la tessellazione (DrawRectPatch, DrawTriPatch, N-patch), il tipo di dati deve essere minore o uguale a D3DDECLTYPE_SHORT4.
- Le dichiarazioni che contengono metodi che richiedono determinate funzionalità del dispositivo (ad esempio, mapping di spostamento, patch RT) possono essere create solo se il dispositivo li supporta.
- Una dichiarazione di vertice usata per disegnare punti e linee non può avere metodi diversi da D3DDECLMETHOD_DEFAULT.
- Le dichiarazioni che possono essere create dipendono anche dalle funzionalità del driver.
Considerazioni sul driver
Driver pre-Direct3D 9
- La dichiarazione di input deve essere tradotta in un FVF valido (avere lo stesso ordine di elementi del vertice e i relativi tipi di dati).
- Le lacune nelle coordinate della trama non sono consentite. Ciò significa che se esiste un elemento vertex con (D3DDECLUSAGE_TEXCOORD, n) dovrebbe essere presente anche un elemento vertex con (D3DDECLUSAGE_TEXCOORD, n-1).
Driver Direct3D 9 senza supporto di Pixel Shader versione 3
- La dichiarazione di input deve essere tradotta in un FVF valido (avere lo stesso ordine di elementi del vertice e i relativi tipi di dati).
- Le lacune nelle coordinate della trama sono consentite.
Driver Direct3D 9 con il supporto di Pixel Shader versione 3
Sono consentite dichiarazioni più generali.
- Gli elementi vertex possono essere in ordine arbitrario e possono avere qualsiasi tipo di dati.
- Più elementi del vertice possono condividere lo stesso offset di flusso e essere di un tipo diverso nello stesso tempo se D3DDEVCAPS2_VERTEXELEMENTSCANSHARESTREAMOFFSET è impostato dal dispositivo.
Utilizzo della dichiarazione vertex con la pipeline vertex programmabile
- In fase di disegno, Direct3D cerca la stessa combinazione "utilizzo - indice di utilizzo" nella dichiarazione del vertice corrente e nella funzione vertex shader corrente. Quando viene trovata la combinazione, il registro dalla funzione shader DCL viene usato come destinazione per l'elemento vertex.
- Quando un elemento vertex nella dichiarazione del vertice corrente ha un utilizzo non trovato nel vertex shader corrente, tale elemento vertex viene ignorato.
- Quando si usa una versione dei vertex shader inferiore a 2.0, è necessario che tutte le semantiche indicate nel codice shader siano presenti nel limite di dichiarazione in fase di disegno. Quando si usano vertex shader 2.0 e versioni successive, questa restrizione che consente alle applicazioni di usare dichiarazioni di vertice diverse con lo stesso vertex shader non esiste. Ciò è utile quando un vertex shader legge i dati di input in base alle condizioni statiche. I registri dello shader vertex non inizializzati a causa di questo valore avranno valori non definiti.
Esistono restrizioni aggiuntive quando si usa con l'elaborazione dei vertici hardware in un driver DirectX 8:
- Gli elementi vertice non possono sovrapporsi o condividere lo stesso offset.
- I tipi di dati sono limitati a ciò che il driver DirectX 8 può comprendere.
La dichiarazione CreateVertexDeclaration potrebbe non riuscire se la dichiarazione specificata non può essere convertita in una dichiarazione in stile DirectX 8. Per un dispositivo in modalità mista, questo errore si verificherà al momento di Draw* perché è l'unica volta che può essere noto se questo shader viene usato con l'hardware o l'elaborazione del vertice software.
Utilizzo della dichiarazione vertex con la pipeline di funzioni fissa
È possibile usare solo dichiarazioni conformi alle regole seguenti:
- Non devono essere presenti lacune tra gli elementi del vertice (SKIP non è stato consentito in una dichiarazione DirectX 8, utilizzata per la pipeline di funzioni fissa).
- La semantica (D3DDECLUSAGE_POSITION, 0) deve essere specificata e deve avere D3DDECLTYPE_FLOAT3 tipo di dati.
- Un elemento vertex con il metodo D3DDECLMETHOD_UV deve specificare l'utilizzo D3DDECLUSAGE_TEXCOORD o D3DDECLUSAGE_BLENDWEIGHT.
- Un elemento vertex con metodo D3DDECLMETHOD_PARTIALU, _PARTIALV o _CROSSUV può essere usato solo con D3DDECLUSAGE_POSITION, _NORMAL, _BLENDWEIGHT o _TEXCOORD e deve usare il tipo di input D3DDECLTYPE_FLOAT3.
Quando una dichiarazione viene usata con l'elaborazione dei vertici hardware in un driver DirectX 8, il runtime Direct3D lo converte in una dichiarazione in stile DirectX 8 con le regole seguenti:
- Gli elementi vertex non possono condividere lo stesso offset in un flusso e non possono sovrapporsi.
- Il tipo di dati deve essere minore o uguale D3DDECLTYPE_SHORT4.
- Sono consentiti solo i metodi seguenti: D3DDECLMETHOD_DEFAULT, D3DDECLMETHOD_CROSSUV e D3DDECLMETHOD_UV
- Il mapping tra una dichiarazione Direct3D 9 e una dichiarazione Direct3D 8 (Direct3D 9) mostra quali semantiche Direct3D 9 possono essere convertite in dichiarazione in stile DirectX 8. Utilizzo e UsageIndex vengono convertiti in un valore di registro.
- Se sono presenti n elementi del vertice in una dichiarazione e 0 - m (m < n) viene mappato a un FVF (elementi descritti nel mapping tra una dichiarazione Direct3D e i codici FVF (Direct3D 9)), ma m + 1 non lo fa, quindi:
- Se uno qualsiasi di m + 2 fino a n - 1 elementi del vertice viene mappato a FVF/dx8decl, la dichiarazione non è valida.
- Gli elementi da 0 a m vengono convertiti (dal runtime per i driver DirectX 8 e precedenti e dai driver Direct3D 9) usando il mapping tra una dichiarazione Direct3D e i codici FVF (Direct3D 9), m + 1, m + 2 fino a n - 1 diventano mappati a texcoord contigui(k), texcoord(k+1), a partire da qualsiasi texcoord negli elementi 0 - m.
- Si presuppone che il tipo di dati in un texcoord mappato sia float[1234] sostituendo qualsiasi tipo di dati che l'elemento corrente contenga (ma le stesse dimensioni). Pertanto, il tipo di dati esistente può essere qualcosa che non è in Mapping tra una dichiarazione Direct3D e codici FVF (Direct3D 9).
- Se k raggiunge 8, la dichiarazione non è valida per FVF/dx8decl.
- Se si sono verificati mapping a texcoords, l'intera dichiarazione è necessaria per non avere elementi con metodo di generazione diverso da DEFAULT o la dichiarazione non è valida per FVF/dx8decl.
Uso delle dichiarazioni vertex con ProcessVertices
Una dichiarazione di vertice può essere usata per descrivere l'output di ProcessVertices. Tale dichiarazione deve rispettare le regole seguenti:
- È necessario usare solo stream 0.
- Sono consentiti solo metodi D3DDECLMETHOD_DEFAULT.
- È possibile usare solo D3DDECLTYPE_FLOATn o D3DDECLTYPE_D3DCOLOR tipi di dati.
- Gli elementi vertex non possono condividere lo stesso offset o sovrapporsi tra loro.
- Gli elementi vertex con (D3DDECLUSAGE_POSITION, 0) o (D3DDECLUSAGE_POSITIONT.0) non sono necessari.
- Gli elementi vertex con (D3DDECLUSAGE_POSITION, 0) e (D3DDECLUSAGE_POSITIONT.0) non possono essere presenti nella stessa dichiarazione.
- Il vertex shader corrente deve essere versione 3.0 o successiva quando tale dichiarazione viene usata.
Argomenti correlati