Condividi tramite


Viewports and Clipping (Direct3D 9)

Concettualmente, un viewport è un rettangolo bidimensionale (2D) in cui viene proiettata una scena 3D. In Direct3D il rettangolo esiste come coordinate all'interno di una superficie Direct3D usata dal sistema come destinazione di rendering. La trasformazione della proiezione converte i vertici nel sistema di coordinate usato per il viewport. Viene usato anche un riquadro di visualizzazione per specificare l'intervallo di valori di profondità in una superficie di destinazione di rendering in cui verrà eseguito il rendering di una scena (in genere da 0,0 a 1,0).

Frustum di visualizzazione

Un frustum di visualizzazione è un volume 3D in una scena posizionata rispetto alla fotocamera del viewport. La forma del volume influisce sul modo in cui i modelli vengono proiettati dallo spazio della fotocamera sullo schermo. Il tipo più comune di proiezione, una proiezione prospettica, è responsabile della creazione di oggetti vicino alla fotocamera appaiono più grandi rispetto agli oggetti a distanza. Per la visualizzazione prospettica, il frustum di visualizzazione può essere visualizzato come una piramide, con la fotocamera posizionata sulla punta, come illustrato nella figura seguente. Questa piramide è intersecata da un piano di ritaglio anteriore e posteriore. Il volume all'interno della piramide tra i piani di ritaglio anteriore e posteriore è il frustum di visualizzazione. Gli oggetti sono visibili solo quando si trovano in questo volume.

illustration of a viewing frustrum with a front and back clipping plan

Se si immagina di essere in piedi in una stanza scura e guardando attraverso una finestra quadrata, si sta visualizzando un frustum di visualizzazione. In questa analogia, il piano di ritaglio vicino è la finestra, e il piano di ritaglio posteriore è quello che interrompe finalmente la vostra vista - il grattacielo attraverso la strada, le montagne in lontananza, o niente affatto. È possibile vedere tutto all'interno della piramide troncata che inizia dalla finestra e termina con qualsiasi interruzione della vista, e non si può vedere altro.

Il frustum di visualizzazione è definito da fov (campo di visualizzazione) e dalle distanze dei piani di ritaglio anteriore e posteriore, specificati nelle coordinate z, come illustrato nel diagramma seguente.

diagram of the viewing frustum

In questo diagramma la variabile D è la distanza dalla fotocamera all'origine dello spazio definito nell'ultima parte della pipeline geometry, ovvero la trasformazione di visualizzazione. Questo è lo spazio intorno a cui disponi i limiti del frustum di visualizzazione. Per informazioni sull'uso di questa variabile D per compilare la matrice di proiezione, vedere Trasformazione di proiezione (Direct3D 9)

Rettangolo del riquadro di visualizzazione

È possibile definire il rettangolo del riquadro di visualizzazione in C++ usando la struttura D3DVIEWPORT9. La struttura D3DVIEWPORT9 viene usata con i seguenti metodi di manipolazione del riquadro di visualizzazione esposti dall'interfaccia IDirect3DDevice9.

La struttura D3DVIEWPORT9 contiene quattro membri, X, Y, Width, Height, che definiscono l'area della superficie di destinazione di rendering in cui verrà eseguito il rendering di una scena. Questi valori corrispondono al rettangolo di destinazione o al rettangolo del riquadro di visualizzazione, come illustrato nel diagramma seguente.

diagram of the viewport rectangle

I valori specificati per i membri X, Y, Width, Height sono coordinate dello schermo relative all'angolo superiore sinistro della superficie di destinazione di rendering. La struttura definisce due membri aggiuntivi (MinZ e MaxZ) che indicano gli intervalli di profondità in cui verrà eseguito il rendering della scena.

Direct3D presuppone che il volume di ritaglio del riquadro di visualizzazione sia compreso tra -1,0 e 1,0 in X e da 1,0 a -1,0 in Y. Queste erano le impostazioni usate più spesso dalle applicazioni in passato. È possibile regolare le proporzioni del riquadro di visualizzazione prima di ritagliare usando la trasformazione di proiezione.

Nota

MinZ e MaxZ indicano gli intervalli di profondità in cui verrà eseguito il rendering della scena e non vengono usati per il ritaglio. La maggior parte delle applicazioni imposta questi membri su 0.0 e 1.0 per consentire al sistema di eseguire il rendering nell'intero intervallo di valori di profondità nel buffer di profondità. In alcuni casi, è possibile ottenere effetti speciali usando altri intervalli di profondità. Ad esempio, per eseguire il rendering di una visualizzazione heads-up in un gioco, puoi impostare entrambi i valori su 0,0 per forzare il rendering degli oggetti in una scena in primo piano oppure puoi impostarli entrambi su 1.0 per eseguire il rendering di un oggetto che deve sempre trovarsi in background.

 

Le dimensioni utilizzate nei membri X, Y, Width, Height della struttura D3DVIEWPORT9 per un viewport definiscono la posizione e le dimensioni del riquadro di visualizzazione sulla superficie di destinazione di rendering. Questi valori sono in coordinate dello schermo, rispetto all'angolo superiore sinistro della superficie.

Direct3D usa la posizione e le dimensioni del riquadro di visualizzazione per ridimensionare i vertici per adattare una scena sottoposta a rendering nella posizione appropriata sulla superficie di destinazione. Internamente, Direct3D inserisce questi valori nella matrice seguente applicata a ogni vertice.

equation of the matrix that is applied to each vertex

Questa matrice ridimensiona i vertici in base alle dimensioni del riquadro di visualizzazione e all'intervallo di profondità desiderato e li converte nella posizione appropriata sulla superficie di destinazione di rendering. La matrice capovolge anche la coordinata y per riflettere un'origine dello schermo nell'angolo superiore sinistro con y crescente verso il basso. Dopo l'applicazione di questa matrice, i vertici sono ancora omogenei, ovvero esistono ancora come vertici [x,y,z,w] e devono essere convertiti in coordinate non omogenee prima di essere inviate al rasterizzatore.

Nota

La matrice di ridimensionamento del viewport incorpora i membri MinZ e MaxZ della struttura D3DVIEWPORT9 per ridimensionare i vertici in base all'intervallo di profondità [MinZ, MaxZ]. Rappresenta una semantica diversa rispetto alle versioni precedenti di DirectX, in cui questi membri sono stati usati per il ritaglio.

 

Nota

Le applicazioni impostano in genere MinZ e MaxZ rispettivamente su 0.0 e 1.0 per fare in modo che il sistema esegua il rendering nell'intero intervallo di profondità. Tuttavia, è possibile usare altri valori per ottenere determinati effetti. Ad esempio, è possibile impostare entrambi i valori su 0,0 per forzare tutti gli oggetti in primo piano o impostare entrambi su 1.0 per eseguire il rendering di tutti gli oggetti in background.

 

Cancellazione di un viewport

La cancellazione del riquadro di visualizzazione reimposta il contenuto del rettangolo del riquadro di visualizzazione sulla superficie di destinazione di rendering. Può anche cancellare il rettangolo nelle superfici del buffer depth e stencil.

Usare IDirect3DDevice9::Clear per cancellare il riquadro di visualizzazione. Il metodo accetta uno o più rettangoli che definiscono le aree sulla superficie da cancellare. L'impostazione del parametro Count su 1 e il parametro pRects sull'indirizzo di un singolo rettangolo che copre l'intera area del riquadro di visualizzazione cancella l'intero riquadro di visualizzazione. Un altro modo per cancellare l'intero viewport consiste nell'impostare il parametro pRects su NULL e il parametro Count su 0.

IDirect3DDevice9 ::Clear può essere usato per cancellare i bit degli stencil all'interno di un buffer di profondità. È sufficiente impostare il parametro Flags per determinare il funzionamento di IDirect3DDevice9::Clear con la destinazione di rendering e i buffer di profondità o stencil associati. Il flag D3DCLEAR_TARGET cancella il riquadro di visualizzazione usando un colore RGBA arbitrario specificato nell'argomento Color (questo non è il colore del materiale). Il flag D3DCLEAR_ZBUFFER cancella il buffer di profondità in una profondità arbitraria specificata in Z: 0,0 è la distanza più vicina e 1,0 è il più lontano. Il flag D3DCLEAR_STENCIL reimposta i bit degli stencil sul valore specificato nell'argomento Stencil. È possibile usare numeri interi compresi tra 0 e 2n-1, dove n è la profondità del bit del buffer degli stencil.

In alcune situazioni, è possibile eseguire il rendering solo in piccole parti della destinazione di rendering e delle superfici del buffer di profondità. I metodi chiari consentono anche di cancellare più aree delle superfici in una singola chiamata. A tale scopo, impostare il parametro Count sul numero di rettangoli da cancellare e specificare l'indirizzo del primo rettangolo in una matrice di rettangoli nel parametro pRects.

Configurare il riquadro di visualizzazione per il ritaglio

I risultati della matrice di proiezione determinano il volume di ritaglio nello spazio di proiezione come segue:

-wc<= xc<= wc

-wc= yc<<= w c

0 <= zc<= wc

Dove: x, y, z e w rappresentano le coordinate dei vertici dopo l'applicazione della trasformazione di proiezione. Tutti i vertici con un componente x, y o z all'esterno di questi intervalli vengono ritagliati, se il ritaglio è abilitato (comportamento predefinito).

Ad eccezione dei vertex buffer, le applicazioni abilitano o disabilitano il ritaglio tramite lo stato di rendering D3DRS_CLIPPING . Le informazioni di ritaglio per i buffer dei vertici vengono generate durante l'elaborazione. Per altre informazioni, vedere Fixed Function Vertex Processing (Direct3D 9) e Programmable Vertex Processing (Direct3D 9).For more information, see Fixed Function Vertex Processing (Direct3D 9) and Programmable Vertex Processing (Direct3D 9).

Direct3D non ritaglia i vertici trasformati di una primitiva da un buffer dei vertici, a meno che non provenga da IDirect3DDevice9::P rocessVertices. Se si eseguono trasformazioni personalizzate ed è necessario Direct3D per eseguire il ritaglio, non è consigliabile usare i vertex buffer. In questo caso, l'applicazione attraversa i dati per trasformarli. Direct3D attraversa i dati una seconda volta per ritagliarli e quindi il driver esegue il rendering dei dati, che è inefficiente. Pertanto, se l'applicazione trasforma i dati, deve anche ritagliarli.

Quando il dispositivo riceve vertici pre-trasformati e illuminati (vertici T&L) che devono essere ritagliati, per eseguire l'operazione di ritaglio i vertici vengono trasformati di nuovo nello spazio di ritaglio utilizzando il reciproco w omogeneo (RHW) del vertice e le informazioni sul viewport. Il ritaglio viene quindi eseguito. Non tutti i dispositivi sono in grado di eseguire questa trasformazione back-transform per ritagliare vertici T&L.

La funzionalità del dispositivo D3DPMISCCpiattaforma di strumenti analitici_CLIPTLVERTS indica se il dispositivo è in grado di ritagliare i vertici T&L. Se questa funzionalità non è impostata, l'applicazione è responsabile del ritaglio dei vertici T&L che intende inviare al dispositivo per il rendering. Il dispositivo è sempre in grado di ritagliare i vertici T&L nella modalità di elaborazione dei vertici software (indipendentemente dal fatto che il dispositivo venga creato nella modalità di elaborazione dei vertici software o passato alla modalità di elaborazione dei vertici software).

L'unico requisito per la configurazione dei parametri del viewport per un dispositivo di rendering consiste nell'impostare il volume di ritaglio del riquadro di visualizzazione. A tale scopo, inizializza e imposta i valori di ritaglio per il volume di ritaglio e per la superficie di destinazione di rendering. I viewport sono in genere configurati per il rendering nell'area completa della superficie di destinazione di rendering, ma questo non è un requisito.

Per ottenere questo risultato in C++, è possibile usare le impostazioni seguenti per i membri della struttura D3DVIEWPORT9.

D3DVIEWPORT9 viewData = { 0, 0, width, height, 0.0f, 1.0f };

Dopo aver impostato i valori nella struttura D3DVIEWPORT9, applicare i parametri del riquadro di visualizzazione al dispositivo chiamando il relativo metodo IDirect3DDevice9::SetViewport. Nell'esempio di codice seguente viene illustrato l'aspetto di questa chiamata.

HRESULT hr;

hr = pd3dDevice->SetViewport(&viewData);
if(FAILED(hr))
    return hr;

Se la chiamata ha esito positivo, i parametri del riquadro di visualizzazione vengono impostati e avranno effetto alla successiva chiamata di un metodo di rendering. Per apportare modifiche ai parametri del riquadro di visualizzazione, è sufficiente aggiornare i valori nella struttura D3DVIEWPORT9 e chiamare nuovamente IDirect3DDevice9::SetViewport.

Nota

I membri della struttura D3DVIEWPORT9 MinZ e MaxZ indicano gli intervalli di profondità in cui verrà eseguito il rendering della scena e non vengono usati per il ritaglio. La maggior parte delle applicazioni imposta questi membri su 0.0 e 1.0 per consentire al sistema di eseguire il rendering nell'intero intervallo di valori di profondità nel buffer di profondità. In alcuni casi, è possibile ottenere effetti speciali usando altri intervalli di profondità. Ad esempio, per eseguire il rendering di una visualizzazione heads-up in un gioco, puoi impostare entrambi i valori su 0,0 per forzare il rendering degli oggetti in una scena in primo piano oppure puoi impostarli entrambi su 1.0 per eseguire il rendering di un oggetto che deve sempre trovarsi in background.

 

Per iniziare