Condividi tramite


Introduzione alla fase di rasterizzazione

Questa sezione descrive l'impostazione del riquadro di visualizzazione, del rettangolo di ritaglio, dello stato del rasterizzatore e del campionamento multiplo.

Impostare l'area di visualizzazione

Un viewport trasforma le posizioni dei vertici (nello spazio clip) in posizioni del target di rendering. Questo passaggio ridimensiona le posizioni 3D nello spazio 2D. Una destinazione di rendering è orientata con gli assi Y che puntano verso il basso; ciò richiede che le coordinate Y vengano capovolte durante la scala del riquadro di visualizzazione. Inoltre, gli extent x e y (intervallo dei valori x e y) vengono ridimensionati 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) 

L'esercitazione 1 crea un viewport 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 in alto a sinistra del riquadro di visualizzazione. MinDepth deve essere minore o uguale a MaxDepth; l'intervallo per MinDepth e MaxDepth è compreso tra 0,0 e 1,0 inclusi. È comune che il riquadro di visualizzazione esegua il mapping a una destinazione di rendering, ma non è necessario; inoltre, il riquadro di visualizzazione non deve avere la stessa dimensione o posizione della destinazione di rendering.

È possibile creare un array di viewport, ma solo uno può essere applicato a un output primitivo dallo shader di geometria. È possibile impostare un solo viewport attivo alla volta. La pipeline usa un viewport predefinito (e un rettangolo di taglio, descritto 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 nel geometry shader, specificare la semantica ViewportArrayIndex sul componente di output GS appropriato nella dichiarazione della firma di output GS.

Il numero massimo di viewport (e rettangoli scissor) che possono essere collegati allo stadio di rasterizzazione in qualsiasi momento è 16 (specificato da D3D11_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE).

Impostare il rettangolo di ritaglio

Un rettangolo di ritaglio offre un'altra opportunità per ridurre il numero di pixel che verranno inviati alla fase di fusione di output. I pixel esterni al rettangolo di forbice vengono rimossi. Le dimensioni del rettangolo scissor sono specificate in numeri interi. Durante la rasterizzazione è possibile applicare un solo rettangolo scissor (basato su ViewportArrayIndex in semantica dei valori di sistema).

Per abilitare il rettangolo di scissor, usa il membro ScissorEnable (nel D3D11_RASTERIZER_DESC1). Il rettangolo di forbice predefinito è un rettangolo vuoto; vale a dire, tutti i valori rect sono 0. In altre parole, se non si configura il rettangolo di ritaglio e il ritaglio è abilitato, non si invieranno pixel alla fase di merger dell'output. La configurazione più comune consiste nell'inizializzare il rettangolo scissor alle dimensioni del riquadro di visualizzazione.

Per impostare una matrice di rettangoli scissor sul 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 utilizza un indice del rettangolo di scissor predefinito durante la rasterizzazione (l'impostazione predefinita è un rettangolo di dimensione zero con ritaglio disabilitato). Per eseguire l'override di ciò, specificare la semantica SV_ViewportArrayIndex per un componente di output GS nella dichiarazione della firma di output GS. In questo modo la fase GS contrassegnerà questo componente di output GS come componente generato dal sistema con la rispettiva semantica. La fase del rasterizzatore riconosce questa semantica e userà il parametro a cui è associato come indice del rettangolo scissor per accedere alla matrice di rettangoli scissor. Non dimenticare di indicare alla fase del rasterizzatore di usare il rettangolo scissor definito abilitando il valore ScissorEnable nella descrizione del rasterizzatore prima di creare l'oggetto rasterizzatore.

Impostare lo stato del rasterizzatore

A partire da Direct3D 10, lo stato del rasterizzatore viene incapsulato in un oggetto stato del rasterizzatore. È possibile creare fino a 4096 oggetti di stato del rasterizzatore che possono quindi essere impostati sul dispositivo passando un handle all'oggetto di stato.

Usare ID3D11Device1::CreateRasterizerState1 per creare un oggetto stato rasterizzatore da una descrizione del rasterizzatore (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 probabilmente la configurazione di rasterizzatore più semplice:

  • Modalità riempimento a tinta unita
  • Cull out o rimuovere le facce posteriori; presupporre l'ordine di avvolgimento antiorario per le primitive
  • Disattivare il bias della profondità, ma abilitare il buffer di profondità e abilitare il rettangolo di ritaglio.
  • Disattivare il multicampionamento e l'anti-aliasing delle linee

Inoltre, le operazioni di rasterizzatore di base includono sempre quanto segue: ritaglio (al frustum di visualizzazione), divisione prospettica e scala del riquadro di visualizzazione. Dopo aver creato correttamente l'oggetto di stato del rasterizzatore, impostarlo sul dispositivo come segue:

    g_pd3dContext->RSSetState(g_pRasterState);

Multicampionamento

Il multicampionamento esegue il campionamento di alcuni o tutti i componenti di un'immagine a una risoluzione superiore (seguito dalla riduzione alla risoluzione originale) per ridurre la forma di aliasing più visibile causata dal disegno dei bordi dei poligoni. Anche se il multicampionamento richiede campioni di sub-pixel, la GPU moderna implementa il multicampionamento in modo che un pixel shader venga eseguito una volta per pixel. Ciò garantisce un compromesso accettabile tra le prestazioni (in particolare in un'applicazione associata a 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 i campioni in un singolo colore pixel o chiamare ID3D11DeviceContext::ResolveSubresource per risolvere gli esempi usando la scheda video. Lo scenario più comune consiste nel disegnare su uno o più target di rendering multisample.

Il multicampionamento è indipendente dal fatto che venga usata o meno una maschera di esempio, alpha-to-coverage sia abilitata o operazioni di stencil (che vengono sempre eseguite per campione).

Il test di profondità è interessato dal multicampionamento:

  • Quando è abilitato il multicampionamento, la profondità viene interpolata per campione e il test depth/stencil viene eseguito per campione; il colore di output del pixel shader viene duplicato per tutti i campioni passati. Se il pixel shader produce profondità, il valore di profondità viene duplicato per tutti i campionamenti (anche se questo scenario perde il vantaggio del 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 senza multicampionamento all'interno di una singola destinazione di rendering. Se si abilita il multicampionamento e si disegna in una destinazione di rendering non multicampionato, si produce lo stesso risultato di se il multicampionamento non fosse abilitato; il campionamento viene eseguito con un singolo campione per pixel.

fase rasterizzatore