Introduzione con la fase rasterizer
Questa sezione descrive l'impostazione del riquadro di visualizzazione, il rettangolo delle forbici, lo stato del rasterizer e il campionamento multi-campionamento.
Impostare viewport
Un viewport esegue il mapping delle posizioni dei vertici (nello spazio clip) in posizioni di destinazione di rendering. Questo passaggio ridimensiona le posizioni 3D nello spazio 2D. Una destinazione di rendering è orientata agli assi Y che puntano verso il basso; ciò richiede che le coordinate Y vengano capovolte durante la scala del viewport. Inoltre, le estensioni x e y (intervallo dei valori x e y) vengono ridimensionate per adattare le dimensioni del riquadro di visualizzazione in base alle formule seguenti:
X = (X + 1) * Viewport.Width * 0.5 + Viewport.TopLeftX
Y = (1 - Y) * Viewport.Height * 0.5 + Viewport.TopLeftY
Z = Viewport.MinDepth + Z * (Viewport.MaxDepth - Viewport.MinDepth)
Esercitazione 1 crea un riquadro di visualizzazione 640 × 480 usando D3D11_VIEWPORT e chiamando ID3D11DeviceContext::RSSetViewports.
D3D11_VIEWPORT vp[1];
vp[0].Width = 640.0f;
vp[0].Height = 480.0f;
vp[0].MinDepth = 0;
vp[0].MaxDepth = 1;
vp[0].TopLeftX = 0;
vp[0].TopLeftY = 0;
g_pd3dContext->RSSetViewports( 1, vp );
La descrizione del riquadro di visualizzazione specifica le dimensioni del riquadro di visualizzazione, l'intervallo a cui eseguire il mapping della profondità (usando MinDepth e MaxDepth) e la posizione del riquadro di visualizzazione superiore sinistro. MinDepth deve essere minore o uguale a MaxDepth; l'intervallo per MinDepth e MaxDepth è compreso tra 0,0 e 1,0, inclusivo. È comune che il viewport esegue il mapping a una destinazione di rendering, ma non è necessario; inoltre, il viewport non deve avere la stessa dimensione o posizione della destinazione di rendering.
È possibile creare una matrice di viewport, ma solo una può essere applicata a un output primitivo dallo shader geometry. È possibile impostare un solo viewport alla volta. La pipeline usa un riquadro di visualizzazione predefinito (e un rettangolo scissor, illustrato nella sezione successiva) durante la rasterizzazione. Il valore predefinito è sempre il primo riquadro di visualizzazione (o rettangolo scissor) nella matrice. Per eseguire una selezione per primitiva del viewport nello shader geometry, specificare la semantica ViewportArrayIndex nel componente di output GS appropriato nella dichiarazione di firma di output GS.
Numero massimo di rettangoli di visualizzazione (e rettangoli scissor) che possono essere associati alla fase rasterizer in qualsiasi momento è 16 (specificato da D3D11_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE).
Impostare il rettangolo scissor
Un rettangolo scissor consente di ridurre il numero di pixel che verranno inviati alla fase di fusione di output. I pixel esterni al rettangolo di scissor vengono rimossi. Le dimensioni del rettangolo scissor sono specificate in interi. È possibile applicare un solo rettangolo scissor (basato su ViewportArrayIndex nella semantica dei valori di sistema) a un triangolo durante la rasterizzazione.
Per abilitare il rettangolo scissor, usare il membro ScissorEnable (in D3D11_RASTERIZER_DESC1). Il rettangolo di scissor predefinito è un rettangolo vuoto; ovvero, tutti i valori di correzione sono 0. In altre parole, se non si configura il rettangolo scissor e la scissor è abilitata, non si inviano pixel alla fase di fusione di output. La configurazione più comune consiste nell'inizializzare il rettangolo scissor alle dimensioni del viewport.
Per impostare una matrice di rettangoli scissor nel dispositivo, chiamare ID3D11DeviceContext::RSSetScissorRects con D3D11_RECT.
D3D11_RECT rects[1];
rects[0].left = 0;
rects[0].right = 640;
rects[0].top = 0;
rects[0].bottom = 480;
g_pd3dContext->RSSetScissorRects( 1, rects );
Questo metodo accetta due parametri: (1) il numero di rettangoli nella matrice e (2) una matrice di rettangoli.
La pipeline usa un indice rettangolo di scissor predefinito durante la rasterizzazione(il valore predefinito è un rettangolo di dimensioni zero con ritagli disabilitato). Per eseguire l'override, specificare la semantica SV_ViewportArrayIndex in un componente di output GS nella dichiarazione di firma di output GS. In questo modo, la fase GS contrassegna questo componente di output GS come componente generato dal sistema con questa semantica. La fase rasterizer riconosce questa semantica e userà il parametro a cui è collegato come indice rettangolo scissor per accedere alla matrice di rettangoli scissor. Non dimenticare di indicare alla fase rasterizer di usare il rettangolo scissor definito abilitando il valore ScissorEnable nella descrizione del rasterizer prima di creare l'oggetto rasterizer.
Impostare lo stato di Rasterizer
A partire da Direct3D 10, lo stato rasterizer viene incapsulato in un oggetto stato rasterizer. È possibile creare fino a 4096 oggetti di stato rasterizzatore che possono quindi essere impostati sul dispositivo passando un handle all'oggetto state.
Usare ID3D11Device1::CreateRasterizerState1 per creare un oggetto stato rasterizer da una descrizione rasterizer (vedere D3D11_RASTERIZER_DESC1).
ID3D11RasterizerState1 * g_pRasterState;
D3D11_RASTERIZER_DESC1 rasterizerState;
rasterizerState.FillMode = D3D11_FILL_SOLID;
rasterizerState.CullMode = D3D11_CULL_FRONT;
rasterizerState.FrontCounterClockwise = true;
rasterizerState.DepthBias = false;
rasterizerState.DepthBiasClamp = 0;
rasterizerState.SlopeScaledDepthBias = 0;
rasterizerState.DepthClipEnable = true;
rasterizerState.ScissorEnable = true;
rasterizerState.MultisampleEnable = false;
rasterizerState.AntialiasedLineEnable = false;
rasterizerState.ForcedSampleCount = 0;
g_pd3dDevice->CreateRasterizerState1( &rasterizerState, &g_pRasterState );
Questo set di stato di esempio esegue forse la configurazione del rasterizzatore più di base:
- Modalità riempimento solido
- Cull out o rimuovere i visi indietro; presupporre un ordine di avvolgimento antiorario per le primitive
- Disattivare la distorsione della profondità, ma abilitare il buffer di profondità e abilitare il rettangolo di scissor
- Disattivare l'anti-aliasing multisampling e line
Inoltre, le operazioni di rasterizzatore di base includono sempre quanto segue: ritaglio (al frustum di visualizzazione), divisione della prospettiva e scala del riquadro di visualizzazione. Dopo aver creato correttamente l'oggetto stato rasterizer, impostarlo sul dispositivo come segue:
g_pd3dContext->RSSetState(g_pRasterState);
Multicampionamento
Esempi di multicampionamento di alcuni o tutti i componenti di un'immagine a una risoluzione superiore (seguita dal downampling alla risoluzione originale) per ridurre la forma più visibile dell'aliasing causato dal disegno dei bordi poligoni. Anche se la multicampionamento richiede esempi di sotto pixel, la GPU moderna implementa multicampionamento in modo che un pixel shader venga eseguito una volta per pixel. Ciò fornisce un compromesso accettabile tra le prestazioni (soprattutto in un'applicazione associata alla GPU) e l'anti-aliasing dell'immagine finale.
Per usare il multicampionamento, impostare il campo di abilitazione nella descrizione della rasterizzazione, creare una destinazione di rendering multicampionato e leggere la destinazione di rendering con uno shader per risolvere gli esempi in un singolo colore pixel o chiamare ID3D11DeviceContext::ResolveSubresource per risolvere gli esempi usando la scheda video. Lo scenario più comune consiste nel disegnare a una o più destinazioni di rendering multicampionato.
Il multicampionamento è indipendente dal fatto che venga usata o meno una maschera di esempio, le operazioni alfa-to-coverage sono abilitate o stencil (che vengono sempre eseguite per esempio).
Il test di profondità è interessato dalla multicampionamento:
- Quando è abilitato il multicampionamento, la profondità viene interpolata per campione e il test di profondità/stencil viene eseguito per campione; il colore di output del pixel shader viene duplicato per tutti gli esempi passati. Se la profondità dello shader pixel restituisce la profondità, il valore di profondità viene duplicato per tutti gli esempi (anche se questo scenario perde il vantaggio di multicampionamento).
- Quando il multicampionamento è disabilitato, i test di profondità/stencil vengono comunque eseguiti per campione, ma la profondità non viene interpolata per campione.
Non esistono restrizioni per la combinazione di rendering multicampionato e non multicampionato all'interno di una singola destinazione di rendering. Se si abilita la multicampionamento e si disegna in una destinazione di rendering non multisampled, si produce lo stesso risultato se la multicampionamento non è stata abilitata; il campionamento viene eseguito con un singolo esempio per pixel.
Argomenti correlati