Condividi tramite


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).

spazio del modello per la trasformazione dello spazio dello schermo

Ecco le descrizioni delle fasi visualizzate nella figura precedente:

  1. 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.

  2. 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.

  3. 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:

    Mostra una matrice di proiezione di prospettiva.

    dove Mij è membro di Mproj.

    Per la proiezione ortogonale abbiamo:

    Proiezione ortogonale

    Direct3D presuppone che la matrice di proiezione di prospettiva abbia il formato:

    matrice di proiezione della prospettiva

    Se la matrice di proiezione di prospettiva non ha questo modulo, ci saranno alcuni artefatti. Ad esempio, la nebbia della tabella non funzionerà.

  4. Direct3D consente all'utente di modificare il volume di clip come indicato di seguito:

    modificare il volume clip

    Questo può essere riscritto come:

    modificare il volume clip riscritto

    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 è:

    matrice mclip

    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   
    
  5. 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.

  6. 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:

    matrice di scalabilità viewport mvs

    dove:

        dwX, dwY - viewport offsets in pixels from D3DVIEWPORT9 
        dwWidth, dwHeight - viewport width and height in pixels from D3DVIEWPORT9    
    
  7. Infine, le coordinate dello schermo vengono calcolate e passate al rasterizer:

    coordinate dello schermo 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