Blending geometry (Direct3D 9)
Direct3D consente a un'applicazione di aumentare il realismo delle scene eseguendo il rendering di oggetti poligonali segmentati, in particolare i caratteri, che hanno articolazioni uniformemente mescolate. Questi effetti vengono spesso definiti pelle. Il sistema ottiene questo effetto applicando matrici di trasformazione del mondo aggiuntive a un singolo set di vertici per creare più risultati e quindi eseguendo una fusione lineare tra i vertici risultanti per creare un singolo set di geometria per il rendering. La figura seguente di una banana mostra questo processo.
La figura precedente illustra come si può immaginare il processo geometry-blending. In una singola chiamata di rendering, il sistema accetta i vertici per la banana, li trasforma due volte, una volta senza modifica, e una volta con una semplice rotazione, e fonde i risultati per creare una banana piegata. Il sistema fonde la posizione del vertice, nonché il vertice normale quando l'illuminazione è abilitata. Le applicazioni non sono limitate a due percorsi di fusione; Direct3D può fondere la geometria tra più di quattro matrici del mondo, tra cui la matrice mondiale standard, D3DTS_WORLD.
Nota
Quando l'illuminazione è abilitata, le normali dei vertici vengono trasformate da una matrice di visualizzazione mondiale inversa corrispondente, ponderata nello stesso modo dei calcoli della posizione del vertice. Il sistema normalizza il vettore normale risultante se lo stato di rendering D3DRS_NORMALIZENORMALS è impostato su TRUE.
Senza la fusione di geometrie, i modelli articolato dinamici vengono spesso sottoposti a rendering nei segmenti. Si consideri, ad esempio, un modello 3D del braccio umano. Nella vista più semplice, un braccio ha due parti: il braccio superiore che si connette al corpo e il braccio inferiore, che si connette alla mano. I due sono connessi al gomito e il braccio inferiore ruota a quel punto. Un'applicazione che esegue il rendering di un braccio potrebbe conservare i dati dei vertici per il braccio superiore e inferiore, ognuno con una matrice di trasformazione mondiale separata. Questo aspetto è illustrato nell'esempio di codice seguente.
typedef struct _Arm
{
VERTEX upper_arm_verts[200];
D3DMATRIX matWorld_Upper;
VERTEX lower_arm_verts[200];
D3DMATRIX matWorld_Lower;
} ARM, *LPARM;
ARM MyArm; // This needs to be initialized.
Per eseguire il rendering del arm, vengono eseguite due chiamate di rendering, come illustrato nel codice seguente.
// Render the upper arm.
d3dDevice->SetTransform( D3DTS_WORLD, &MyArm.matWorld_Upper );
d3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, numFaces );
// Render the lower arm, updating its world matrix to articulate
// the arm by pi/4 radians (45 degrees) at the elbow.
MyArm.matWorld_Lower = RotateMyArm(MyArm.matWorld, pi/4);
d3dDevice->SetTransform( D3DTS_WORLD, &MyArm.matWorld_Lower );
d3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, numFaces );
La figura seguente è una banana, modificata per usare questa tecnica.
Le differenze tra la geometria combinata e la geometria nonblend sono ovvie. Questo esempio è piuttosto estremo. In un'applicazione reale, le articolazioni dei modelli segmentati sono progettate in modo che le cuciture non siano così ovvie. Tuttavia, le seams sono visibili a volte, che presenta sfide costanti per i progettisti di modelli.
La fusione geometry in Direct3D offre un'alternativa allo scenario di modellazione segmentata classica. Tuttavia, la qualità visiva migliorata degli oggetti segmentati deriva dal costo dei calcoli di fusione durante il rendering. Per ridurre al minimo l'impatto di queste operazioni aggiuntive, la pipeline geometry Direct3D è ottimizzata per combinare la geometria con il sovraccarico minimo possibile. Le applicazioni che usano in modo intelligente i servizi di fusione geometria offerti da Direct3D possono migliorare il realismo dei loro caratteri evitando gravi ripercussioni sulle prestazioni.
Fusione di stati di trasformazione e rendering
Il metodo IDirect3DDevice9::SetTransform riconosce le macro D3DTS_WORLD e D3DTS_WORLDn , che corrispondono ai valori che possono essere definiti dalla macro D3DTS_WORLDMATRIX. Queste macro vengono usate per identificare le matrici tra cui verrà combinata la geometria.
Il tipo enumerato D3DRENDERSTATETYPE include lo stato di rendering D3DRS_VERTEXBLEND per abilitare e controllare la fusione della geometria. I valori validi per questo stato di rendering sono definiti dal tipo enumerato D3DVERTEXBLENDFLAGS . Se la fusione geometry è abilitata, il formato del vertice deve includere il numero appropriato di pesi di fusione.
Pesi di fusione
Un peso di fusione, talvolta denominato peso beta, controlla la misura in cui una determinata matrice mondiale influisce su un vertice. I pesi di fusione sono valori a virgola mobile che vanno da 0,0 a 1.0, codificati nel formato del vertice, dove un valore pari a 0,0 indica che il vertice non viene unito a tale matrice e 1,0 significa che il vertice è interessato completamente dalla matrice.
I pesi di fusione geometry vengono codificati nel formato del vertice, visualizzati immediatamente dopo la posizione per ogni vertice, come descritto in Codici FVF per le funzioni fisse (Direct3D 9). Si comunica il numero di pesi di fusione nel formato del vertice includendo una delle costanti FVF nella descrizione del vertice fornite ai metodi di rendering.
Il sistema esegue una miscela lineare tra i risultati ponderati delle matrici di blend. L'equazione seguente è la formula completa di fusione.
Nell'equazione precedente vBlend è il vertice di output, gli elementi v sono i vertici generati dalla matrice mondiale applicata (D3DTS_WORLDn). Gli elementi W sono i valori di peso corrispondenti nel formato del vertice. Un vertice misto tra n matrici può avere - 1 valori di peso di fusione, uno per ogni matrice di fusione, ad eccezione dell'ultimo. Il sistema genera automaticamente il peso per l'ultima matrice mondiale in modo che la somma di tutti i pesi sia 1,0, espressa nella notazione sigma qui. Questa formula può essere semplificata per ognuno dei casi supportati da Direct3D, che è illustrato nelle equazioni seguenti.
Queste sono le forme semplificate della formula di fusione completa per i due, tre e quattro casi matrice di blend.
Nota
Anche se Direct3D include descrittori FVF per definire vertici contenenti fino a cinque pesi di fusione, è possibile usare solo tre in questa versione di DirectX.
Altre informazioni sono contenute negli argomenti seguenti.
- Uso della fusione geometry (Direct3D 9)
- Blending vertex indicizzato (Direct3D 9)
- Vertex Tweening (Direct3D 9)
Argomenti correlati