Condividi tramite


Fusione geometrica (Direct3D 9)

Direct3D consente a un'applicazione di aumentare il realismo delle sue scene eseguendo il rendering di oggetti poligonali segmentati, in particolare i personaggi, con articolazioni uniformemente mescolate. Questi effetti sono spesso definiti skinning. Il sistema ottiene questo effetto applicando matrici di trasformazione globale 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 geometrie per il rendering. La figura seguente di una banana mostra questo processo.

illustrazione del processo per combinare due oggetti con texture banana

La figura precedente mostra come si immagini il processo di fusione della geometria. In una singola chiamata di rendering, il sistema prende 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é la normale del vertice quando l'illuminazione è abilitata. Le applicazioni non sono limitate a due percorsi di fusione; Direct3D può combinare la geometria tra più di quattro matrici mondiali, inclusa la matrice globale standard, D3DTS_WORLD.

Nota

Quando l'illuminazione è abilitata, le normali dei vertici vengono trasformate da una matrice di visualizzazione globale inversa corrispondente, ponderata nello stesso modo dei calcoli delle posizioni dei vertici. Il sistema normalizza il vettore normale risultante se lo stato di rendering D3DRS_NORMALIZENORMALS è impostato su TRUE.

 

Senza fusione geometrica, il rendering di modelli dinamici articolati viene spesso eseguito in 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 collegati 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 globale separata. Nell'esempio di codice seguente viene illustrato questo.

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 braccio, vengono effettuate 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 utilizzare questa tecnica.

illustrazione di una banana miscelata senza fusione geometrica

Le differenze tra la geometria combinata e la geometria nonblended sono evidenti. Questo esempio è un po' estremo. In un'applicazione reale, le articolazioni dei modelli segmentati sono progettate in modo che le cuciture non siano così ovvie. Tuttavia, le cuciture sono visibili a volte, che presentano sfide costanti per i progettisti di modelli.

La fusione della geometria in Direct3D offre un'alternativa allo scenario classico di modellazione segmentata. Tuttavia, la migliore qualità visiva degli oggetti segmentati comporta il costo dei calcoli di fusione durante il rendering. Per ridurre al minimo l'impatto di queste operazioni aggiuntive, la pipeline di geometria Direct3D è ottimizzata per combinare la geometria con il minor sovraccarico possibile. Le applicazioni che usano in modo intelligente i servizi di fusione di geometria offerti da Direct3D possono migliorare il realismo dei loro personaggi evitando gravi ripercussioni sulle prestazioni.

Fusione degli stati di trasformazione e di 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 utilizzate per identificare le matrici tra le quali 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 geometrica è abilitata, il formato dei vertici deve includere il numero appropriato di pesi di fusione.

Pesi di Miscelazione

Un peso di fusione, talvolta chiamato peso beta, controlla la misura in cui una determinata matrice globale influisce su un vertice. I pesi di fusione sono valori a virgola mobile compresi tra 0,0 e 1,0, codificati nel formato vertice, in cui un valore pari a 0,0 indica che il vertice non viene combinato con tale matrice e 1,0 indica che il vertice è interessato completamente dalla matrice.

I pesi di fusione della geometria vengono codificati nel formato dei vertici, visualizzati immediatamente dopo la posizione per ogni vertice, come descritto in codici FVF della funzione fissa (Direct3D 9). È possibile comunicare il numero di pesi di fusione nel formato del vertice includendo una delle costanti FVF nella descrizione del vertice specificata ai metodi di rendering.

Il sistema esegue una fusione lineare tra i risultati ponderati delle matrici di fusione. L'equazione seguente è la formula di fusione completa.

equazione della fusione lineare, usando matrici di trasformazione globale

Nell'equazione precedente vBlend è il vertice di output, gli elementi v sono i vertici prodotti dalla matrice globale 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 in notazione sigma qui. Questa formula può essere semplificata per ognuno dei casi supportati da Direct3D, come illustrato nelle equazioni seguenti.

equazioni di fusione lineare per tre casi di fusione

Queste sono le forme semplificate della formula di fusione completa per i due, tre e quattro casi della matrice di fusione.

Nota

Anche se Direct3D include descrittori FVF per definire vertici contenenti fino a cinque pesi di fusione, in questa versione di DirectX possono essere usati solo tre.

 

Altre informazioni sono contenute negli argomenti seguenti.

Pipeline dei vertici