Pipeline di trasformazione Direct3D
Questo articolo fornisce una spiegazione tecnica per gli sviluppatori di applicazioni Direct3D su come impostare i parametri della pipeline di trasformazione Direct3D tramite la manipolazione diretta delle matrici Direct3D.
Panoramica
Direct3D usa tre trasformazioni per modificare le coordinate del modello 3D in coordinate pixel (spazio dello schermo). Queste trasformazioni sono trasformazione mondiale, trasformazione della visualizzazione e trasformazione della proiezione.
La trasformazione mondiale controlla il modo in cui le coordinate del modello vengono trasformate in coordinate mondiali. La trasformazione mondiale può includere traduzioni, rotazioni e scalabilità, ma non si applica alle luci. Per altre informazioni sull'uso delle trasformazioni del mondo, vedere Trasformazione mondiale.
La trasformazione visualizza controlla la transizione dalle coordinate del mondo allo spazio della fotocamera, determinando la posizione della fotocamera nel mondo. Per un esempio di utilizzo delle trasformazioni di visualizzazione, vedere Trasformazione visualizzazione.
La trasformazione della proiezione modifica la geometria dallo spazio della fotocamera in "spazio clip" e applica la distorsione della prospettiva. Il termine "spazio clip" si riferisce al modo in cui la geometria viene ritagliata al volume di visualizzazione durante questa trasformazione. Per un esempio di utilizzo delle trasformazioni di proiezione, vedere Trasformazione proiezione.
Infine, la geometria nello spazio clip viene trasformata in coordinate pixel (spazio dello schermo). Questa trasformazione è controllata dalle impostazioni del riquadro di visualizzazione.
Il ritaglio e la trasformazione dei vertici devono essere distribuiti nello spazio omogeneo (semplicemente messo, spazio in cui il sistema di coordinate include un quarto elemento), ma il risultato finale per la maggior parte delle applicazioni deve essere coordinate tridimensionali non omogenee (3D) definite in "spazio dello schermo". Ciò significa che sia i vertici di input che il volume di ritaglio devono essere convertiti in spazio omogeneo per eseguire il ritaglio e quindi traslato in spazio non omogeneo da visualizzare.
Le tre trasformazioni Direct3D, la visualizzazione e la trasformazione della proiezione sono definite dalle matrici Direct3D. Una matrice Direct3D è una matrice omogenea 4x4 definita da una struttura D3DMATRIX . Anche se le matrici Direct3D non sono oggetti standard, non sono rappresentate da un'interfaccia COM, è possibile crearle e impostarle come si farebbe con qualsiasi altro oggetto Direct3D. Per altre informazioni sulle matrici Direct3D, vedere Trasformazioni.
Pipeline di trasformazione
Se un vertice nella coordinata del modello viene specificato da Pm = (Xm, Ym, Zm, 1), le trasformazioni visualizzate nella figura seguente vengono applicate alle coordinate dello schermo di calcolo Ps = (Xs, Ys, Zs, Ws).
Ecco le descrizioni delle fasi visualizzate nella figura precedente:
La matrice mondiale Mworld trasforma i vertici dallo spazio del modello allo spazio mondiale. Questa matrice è impostata da:
d3dDevice->SetTransform (D3DTRANSFORMSTATE_WORLD, matrix address)
L'implementazione Direct3D presuppone che l'ultima colonna di questa matrice sia (0, 0, 0, 1). Non viene restituito alcun errore se l'utente specifica una matrice con un'ultima colonna diversa, ma l'illuminazione e la nebbia non saranno corretti.
Visualizza matrice Mview trasforma i vertici dallo spazio mondiale allo spazio della fotocamera. Questa matrice è impostata da:
d3dDevice->SetTransform (D3DTRANSFORMSTATE_VIEW, matrix address)
L'implementazione Direct3D presuppone che l'ultima colonna di questa matrice sia (0, 0, 0, 1). Non viene restituito alcun errore se l'utente specifica una matrice con un'ultima colonna diversa, ma l'illuminazione e la nebbia non saranno corretti.
Matrice di proiezione Mproj trasforma i vertici dallo spazio della fotocamera allo spazio di proiezione. Questa matrice è impostata da:
d3dDevice->SetTransform (D3DTRANSFORMSTATE_PROJECTION, matrix address)
L'ultima colonna della matrice di proiezione deve essere (0, 0, 1, 0) o (0, 0, a, 0) per correggere gli effetti di nebbia e illuminazione; (0, 0, 1, 0) modulo è preferito.
Il volume di ritaglio per tutti i punti Xp = (Xp, Yp, Zp, Wp) nello spazio di proiezione è definito come:
-Wp < Xp <= Wp -Wp < Yp <= Wp 0 < Zp <= Wp
Tutti i punti che non soddisfano queste equazioni verranno ritagliati.
Se un volume di visualizzazione è definito come:
- Larghezza della finestra dello schermo a scorrimento nello spazio della fotocamera in un piano di ritaglio vicino
- Altezza della finestra sh-screen nello spazio della fotocamera in un piano di ritaglio vicino
- Distanza da Zn al piano di ritaglio vicino lungo gli assi Z nello spazio della fotocamera
- Distanza Zf al piano di ritaglio lontano lungo gli assi Z nello spazio della fotocamera
una matrice di proiezione di prospettiva potrebbe quindi essere scritta come segue:
dove Mij è membro di Mproj.
Per la proiezione ortogonale abbiamo:
Direct3D presuppone che la matrice di proiezione di prospettiva abbia il formato:
Se la matrice di proiezione di prospettiva non ha questo modulo, ci saranno alcuni artefatti. Ad esempio, la nebbia della tabella non funzionerà.
Direct3D consente all'utente di modificare il volume di clip come indicato di seguito:
Questo può essere riscritto come:
dove:
Cx, Cy - dvClipX, dvClipY from D3DVIEWPORT9 Cw, Ch - dvClipWidth, dvClipHeight from D3DVIEWPORT9 Zmin, Zmax - dvMinZ, dvMaxZ from D3DVIEWPORT9
Questa trasformazione può offrire una maggiore precisione ed è equivalente al ridimensionamento e allo spostamento del volume di ritaglio.
La matrice Mclip corrispondente è:
Un vertice viene trasformato da:
dvClipWidth = 2 dvClipHeight = 2 dvClipX = -1 dvClipY = 1 dvMinZ = 0 dvMaxZ = 1
Se non si vuole ridimensionare il volume clip, è possibile impostare i parametri viewport su valori predefiniti:
(Xc, Yc, Zc, Wc) = (Xp, Yp, Zp, Wp) * Mclip
La fase di ritaglio è facoltativa se l'utente specifica il flag di D3DDP_DONOTCLIP in una chiamata DrawPrimitive. In questo caso, tutte le matrici (incluse le Mvs) possono essere combinate.
La matrice di scalabilità del riquadro di visualizzazione Mvs ridimensiona le coordinate per essere all'interno della finestra del riquadro di visualizzazione e capovolge l'asse Y da verso il basso:
dove:
dwX, dwY - viewport offsets in pixels from D3DVIEWPORT9 dwWidth, dwHeight - viewport width and height in pixels from D3DVIEWPORT9
Infine, le coordinate dello schermo vengono calcolate e passate al rasterizer:
Suggerimenti sull'utilizzo
Ecco alcuni suggerimenti per come usare la pipeline di trasformazione Direct3D:
L'ultima colonna delle matrici di visualizzazione e del mondo deve essere (0, 0, 0, 1) o l'illuminazione non sarà corretta.
Impostare i parametri del viewport per compilare una matrice Mclip identity, a meno che non si comprenda esattamente ciò che è necessario per.
dvClipWidth = 2 dvClipHeight = 2 dvClipX = -1 dvClipY = 1 dvMinZ = 0 dvMaxZ = 1