Regole di rasterizzazione

Le regole di rasterizzazione definiscono la modalità di mapping dei dati vettoriali ai dati raster. I dati raster vengono bloccati su posizioni intere che verranno raccolte e ritagliate (per disegnare il numero minimo di pixel) e gli attributi per singolo pixel vengono interpolati (da attributi per singolo vertice) prima di essere passati a un pixel shader.

Esistono diversi tipi di regole, che dipendono dal tipo di primitiva del quale viene eseguito il mapping, nonché dal fatto che i dati usino o meno il multicampionamento per ridurre l'aliasing. Le illustrazioni seguenti illustrano come vengono gestiti i casi limite.

Regole di rasterizzazione dei triangoli (senza multicampionamento)

Qualsiasi centro pixel che cade all'interno di un triangolo viene disegnato; si presuppone che un pixel sia all'interno se supera la regola in alto a sinistra. La regola in alto sinistra è che un centro pixel viene definito per trovarsi all'interno di un triangolo se si trova sul bordo superiore o sul bordo sinistro di un triangolo.

dove:

  • Un bordo superiore è un bordo esattamente orizzontale che si trova sopra gli altri bordi.
  • Un bordo sinistro è un bordo non esattamente orizzontale che si trova sul lato sinistro del triangolo Un triangolo può avere uno o due bordi sinistri.

La regola in alto a sinistra garantisce che i triangoli adiacenti vengano disegnati una volta.

Questa figura mostra esempi di pixel disegnati che si trovano all'interno di un triangolo o seguono la regola in alto a sinistra.

examples of top-left triangle rasterization

La copertura grigio chiaro e scuro dei pixel li mostra come gruppi di pixel per indicare il triangolo all'interno.

Regole di rasterizzazione di riga (con alias, senza multicampionamento)

Le regole di rasterizzazione delle linee usano un'area di test a rombo per determinare se una linea copre un pixel. Per le linee x-major (linee con -1 <= pendenza <= +1), l'area di test a rombo include (mostrata) il bordo inferiore sinistro, il bordo inferiore destro e l'angolo inferiore destro; il diamante esclude (mostrata) il bordo superiore sinistro, il bordo superiore destro, il cavo superiore, l'angolo sinistro e l'angolo destro. Una linea y-major è qualsiasi riga che non è una linea x-major; l'area del rombo di prova è uguale a quella descritta per la linea x-major, ad eccezione dell'angolo destro.

Data l'area del diamante, una linea copre un pixel se questa esce dall'area di test del diamante del pixel quando si viaggia lungo la linea dall'inizio verso la fine. Una striscia di linea si comporta allo stesso modo, in quanto viene disegnata come una sequenza di linee.

Nella figura seguente vengono illustrati alcuni esempi.

examples of aliased line rasterization

Regole di rasterizzazione di riga (con alias, senza multicampionamento)

Una linea antialiased viene rasterizzata come se fosse un rettangolo (con larghezza = 1). Il rettangolo si interseca con una destinazione di rendering che produce valori di copertura per pixel, moltiplicati in componenti alfa di output pixel shader. Non esiste alcuna anti-aliasing premascherata quando si disegnano linee su una destinazione di rendering multicampionato.

Si ritiene che non esista un unico modo "migliore" per eseguire il rendering delle linee antialiased. Direct3D adotta come linea guida il metodo illustrato nella figura seguente. Questo metodo è stato derivato empiricamente, con una serie di proprietà visive ritenute auspicabili.

L'hardware non deve corrispondere esattamente a questo algoritmo; i test contro questo riferimento devono avere tolleranze "ragionevoli", guidate da alcuni dei principi elencati più avanti, consentendo diverse implementazioni hardware e dimensioni del kernel di filtro. Nessuna di questa flessibilità consentita nell'implementazione hardware, tuttavia, può essere comunicata tramite Direct3D alle applicazioni, oltre semplicemente a disegnare linee e osservare/misurare il modo in cui appaiono.

examples of antialiased line rasterization

Questo algoritmo genera linee relativamente lisce, di intensità uniforme, con bordi frastagliati o intrecci minimi. Il modello Moire per le linee di chiusura è ridotto a icona. Esiste una buona copertura per le giunzioni tra segmenti di linea con posizionamento end-to-end.

Il kernel di filtro è un compromesso ragionevole tra la quantità di sfocatura dei bordi e le variazioni di intensità causate dalle correzioni gamma. Il valore di copertura viene moltiplicato in pixel shader o0.a (srcAlpha) per la formula seguente per la fase Output Merger (OM):

srcColor * srcAlpha + destColor * (1-srcAlpha)

Regole di rasterizzazione dei punti (senza multicampionamento)

Un punto viene interpretato come se fosse composto da due triangoli in un modello Z, che usano regole di rasterizzazione dei triangoli. La coordinata identifica il centro di un quadrato largo un pixel. Non c'è alcuno scellino per i punti.

Nella figura seguente vengono illustrati alcuni esempi.

examples of point rasterization

Regole di rasterizzazione anti-aliasing multisample

L'anti-aliasing multisample (MSAA) riduce l'aliasing della geometria usando i test di copertura dei pixel e lo-stencil in profondità su più posizioni di sottocampionamento. Per migliorare le prestazioni, i calcoli per pixel vengono eseguiti una volta per ogni pixel coperto, condividendo gli output dello shader tra sotto-pixel coperti. L'anti-aliasing multisample non riduce l'aliasing della superficie. Le posizioni del campione e le funzioni di ricostruzione dipendono dall'implementazione hardware.

Nella figura seguente vengono illustrati alcuni esempi.

examples of multisample antialias rasterization

Il numero di posizioni del campione dipende dalla modalità multisample. Gli attributi dei vertici vengono interpolati in corrispondenza dei centri pixel, poiché questo è il punto in cui viene richiamato il pixel shader (questo diventa estrapolazione se il centro non è coperto). Gli attributi possono essere contrassegnati nel pixel shader per essere campionati al centro, causando l'interpolazione di pixel non coperti all'interpolazione dell'attributo all'intersezione dell'area del pixel e della primitiva.

Un pixel shader viene eseguito per ogni area di 2x2 pixel per supportare calcoli derivati (che usano delta x e y). Ciò significa che le chiamate dello shader avvengono più di quanto mostrato per riempire i quanti minimi di 2x2 (il che è indipendente dal multicampionamento). Il risultato dello shader viene scritto per ogni campione coperto che supera il test dello-stencil in profondità per campione.

Le regole di rasterizzazione per le primitive sono, in generale, invariate dall'antialiasing multisample, ad eccezione di:

  • Per un triangolo, viene eseguito un test di copertura per ogni posizione del campione (non per un centro pixel). Se viene coperta più di una posizione del campione, un pixel shader viene eseguito una volta con attributi interpolati al centro pixel. Il risultato viene archiviato (replicato) per ogni posizione del campione coperta nel pixel che supera il test profondità/stencil.

    Una linea viene considerata come un rettangolo costituito da due triangoli, con una larghezza di linea pari a 1,4.

  • Per un punto, viene eseguito un test di copertura per ogni posizione del campione (non per un centro pixel).

I formati di multicampionamento possono essere usati nelle destinazioni di rendering che possono essere riletti negli shader usando il caricamento, poiché non è necessaria alcuna risoluzione per i singoli campioni a cui si accede dallo shader. I formati di profondità non sono supportati per le risorse multisample, pertanto i formati di profondità sono limitati solo alle destinazioni di rendering.

I formati senza tipi supportano il multicampionamento per consentire a una visualizzazione delle risorse di interpretare i dati in modi diversi. Ad esempio, è possibile creare una risorsa multisample usando R8G8B8A8_TYPELESS, eseguirne il rendering usando una risorsa visualizzazione-destinazione-rendering con un formato R8G8B8A8_UINT, quindi risolvere il contenuto in un'altra risorsa con un formato di dati R8G8B8A8_UNORM.

Supporto hardware

L'API segnala il supporto hardware per il multicampionamento tramite il numero di livelli di qualità. Ad esempio, un livello di qualità 0 indica che l'hardware non supporta il multicampionamento (a un particolare formato e livello di qualità). Un valore 3 per i livelli di qualità indica che l'hardware supporta tre diversi layout di esempio e/o algoritmi di risoluzione. È inoltre possibile supporre quanto segue:

  • Qualsiasi formato che supporta il multicampionamento supporta lo stesso numero di livelli di qualità per ogni formato della famiglia.
  • Ciascun formato che supporta il multicampionamento e dispone di formati _UNORM, _SRGB, _SNORM o _FLOAT, supporta anche la risoluzione.

Campionamento centroid degli attributi durante l'antialiasing multicampione

Per impostazione predefinita, gli attributi dei vertici vengono interpolati in un centro pixel durante l'anti-aliasing multicampione; se il centro pixel non è coperto, gli attributi vengono estrapolati in un centro pixel. Se un input pixel shader che contiene la semantica centroide (presupponendo che il pixel non sia completamente coperto) verrà campionato in un punto qualsiasi all'interno dell'area coperta del pixel, possibilmente in una delle posizioni di campione coperte. Prima del calcolo centroide viene applicata una maschera campione (specificata dallo stato del rasterizzatore). Pertanto, un campione mascherato non verrà usato come posizione centrale.

Il rasterizzatore di riferimento sceglie una posizione campione per il campionamento centroid simile al seguente:

  • La maschera campione consente tutti i campioni. Usa un centro pixel se il pixel è coperto o se nessuno dei campioni è coperto. In caso contrario, viene scelto il primo campione coperto, a partire dal centro pixel e spostandosi verso l'esterno.
  • La maschera di campione disattiva tutti i campioni eccetto uno (si tratta di uno scenario comune). Un'applicazione può implementare il sovracampionamento multipass eseguendo il ciclo tramite valori di maschera campione a bit singolo ed eseguendo nuovamente il rendering della scena per ogni campione usando il campionamento centroid. Ciò richiederebbe che un'applicazione regola i derivati per selezionare in modo appropriato gli errori di texture più dettagliati per la densità di campionamento delle texture più elevata.

Calcoli derivati durante il multicampionamento

I pixel shader vengono sempre eseguiti usando un'area minima di 2x2 pixel per supportare calcoli derivati, calcolati prendendo delta tra i dati dai pixel adiacenti (presupponendo che i dati in ogni pixel siano stati campionati con spaziatura orizzontale o verticale). Questo aspetto non è influenzato dal multicampionamento.

Se i derivati vengono richiesti su un attributo che è stato campionato al centro, il calcolo dell'hardware non viene modificato, il che può causare derivati imprecisi. Uno shader prevede un vettore di unità nello spazio di destinazione di rendering, ma può ottenere un vettore non unitario rispetto ad altri spazi vettoriali. Pertanto, è responsabilità di un'applicazione prestare attenzione quando si richiedono derivati da attributi a campionamento centroid.

Infatti, è consigliabile non combinare derivati e campionamento centroid. Il campionamento centroid può essere utile per situazioni in cui è fondamentale che gli attributi interpolati di una primitiva non vengano estrapolati, ma ciò comporta compromessi, ad esempio attributi che sembrano saltare nel punto in cui un bordo primitivo attraversa un pixel (anziché cambiare in continuo) o derivati che non possono essere usati dalle operazioni di campionamento delle texture che derivano il LOD.

Appendici

Fase Rasterizer (RS)