Condividi tramite


Regole di rasterizzazione

Le regole di rasterizzazione definiscono il modo in cui i dati vettoriali vengono mappati nei dati raster. I dati raster vengono ritagliati in posizioni intere che vengono quindi ritagliate e ritagliate (per disegnare il numero minimo di pixel) e gli attributi per pixel vengono interpolati (da attributi per vertice) prima di essere passati a un pixel shader.

Esistono diversi tipi di regole, che dipendono dal tipo di primitiva mappata, oltre che dal fatto che i dati usino multicampionamento per ridurre l'aliasing. Le illustrazioni seguenti illustrano come vengono gestiti i case di angolo.

Regole di rasterizzazione triangolo (senza multicampionamento)

Qualsiasi centro pixel che cade all'interno di un triangolo viene disegnato; si presuppone che un pixel sia all'interno se passa la regola in alto a sinistra. La regola in alto a sinistra è che un centro pixel è 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 e si trova sopra gli altri bordi.
  • Un bordo sinistro, è un bordo che non è esattamente orizzontale e si trova sul lato sinistro del triangolo. Un triangolo può avere uno o due bordi sinistro.

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

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

illustrazione di esempi di rasterizzazione del triangolo superiore sinistro

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

Regole di rasterizzazione riga (aliased, senza multicampionamento)

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

Dato l'area del diamante, una linea copre un pixel se la linea chiude l'area di test del diamante del pixel durante il viaggio lungo la linea dall'inizio verso la fine. Una striscia di linee si comporta come una sequenza di linee.

La figura seguente mostra alcuni esempi.

illustrazione di esempi di rasterizzazione della riga aliasta

Regole di rasterizzazione linea (antialiased, senza multicampionamento)

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

Si ritiene che non esista un unico modo "migliore" per eseguire il rendering di linee antialiased. Direct3D 10 adotta come linee guida il metodo illustrato nella figura seguente. Questo metodo è stato derivato in modo empirico, mostrando una serie di proprietà visive considerate 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 di seguito, consentendo diverse implementazioni hardware e dimensioni del kernel di filtro. Nessuna di questa flessibilità consentita nell'implementazione hardware, tuttavia, può essere comunicata tramite Direct3D 10 alle applicazioni, oltre semplicemente a disegnare linee e osservare/misurare il loro aspetto.

illustrazione di esempi di rasterizzazione linea antialiased

Questo algoritmo genera linee relativamente fluide, con intensità uniforme, con bordi minimi o braidatura minima. Il modello Moire per le linee vicine viene ridotto al minimo. C'è una buona copertura per le giunzioni tra segmenti di linea posizionati end-to-end. Il kernel del 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 dalla fase di fusione di output: srcColor * srcAlpha + destColor * (1-srcAlpha).

Regole di rasterizzazione punto (senza multicampionamento)

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

La figura seguente mostra alcuni esempi.

illustrazione di esempi di rasterizzazione punto

Regole di rasterizzazione anti-aliasing multisample

Multisample antialiasing (MSAA) riduce l'aliasing geometry usando i test di copertura pixel e profondità-stencil in più posizioni di esempio secondarie. Per migliorare le prestazioni, i calcoli per pixel vengono eseguiti una volta per ogni pixel coperto, condividendo gli output shader tra i sotto pixel coperti. L'antiasing multisample non riduce l'aliasing della superficie. Le posizioni di esempio e le funzioni di ricostruzione dipendono dall'implementazione hardware.

La figura seguente mostra alcuni esempi.

illustrazione di esempi di rasterizzazione antisample multisample

Il numero di posizioni di esempio dipende dalla modalità multisample. Gli attributi del vertice vengono interpolati nei centri pixel, poiché questo è il punto in cui viene richiamato lo shader pixel (questo diventa extrapolazione se il centro non è coperto). Gli attributi possono essere contrassegnati nel pixel shader da campionamento centroid, che causa l'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 shader si verificano più di quanto venga mostrato per compilare il minimo 2x2 quanti (che è indipendentemente dal multicampionamento). Il risultato dello shader viene scritto per ogni campione coperto che supera il test di profondità di esempio.

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

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

    Una linea viene considerata come 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 di esempio (non per un centro pixel).

Molti formati supportano la multicampionamento (vedere Supporto hardware per formati Direct3D 10), alcuni formati possono essere risolti (ResolveSubresource, che esegue il downampling di un formato multicampionato a una dimensione di esempio pari a 1). I formati di multicampionamento possono essere usati nelle destinazioni di rendering che possono essere letti di nuovo in shader usando il carico, poiché non è necessaria alcuna risoluzione per singoli esempi a cui si accede dallo shader. I formati di profondità non sono supportati per la risorsa multisample, pertanto i formati di profondità sono limitati solo alle destinazioni di rendering.

I formati senza tipi (R8G8B8A8_TYPELESS per esempio) 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 di visualizzazione di destinazione di 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 la multicampionamento tramite il numero di livelli di qualità. Ad esempio, un livello di qualità 0 indica che l'hardware non supporta la multicampionamento (a un determinato formato e livello di qualità). Un 3 per i livelli di qualità significa che l'hardware supporta tre diversi layout di esempio e/o algoritmi di risoluzione. È anche possibile presupporre quanto segue:

  • Qualsiasi formato che supporta il multicampionamento, supporta lo stesso numero di livelli di qualità per ogni formato in tale famiglia.
  • Ogni formato che supporta il multicampionamento e include i formati di _UNORM, _SRGB, _SNORM o _FLOAT, supporta anche la risoluzione.

Campionamento centroid degli attributi durante l'antialiasing multisample

Per impostazione predefinita, gli attributi del vertice vengono interpolati a un centro pixel durante l'antialiasing multisample; 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à campione in un punto all'interno dell'area coperta del pixel, eventualmente in una delle posizioni di esempio coperte. Una maschera di esempio (specificata dallo stato rasterizer) viene applicata prima del calcolo centroid. Pertanto, un esempio mascherato non verrà usato come posizione centrale.

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

  • La maschera di esempio consente tutti gli esempi. Usare un centro pixel se il pixel è coperto o se non sono coperti nessuno degli esempi. In caso contrario, il primo esempio coperto viene scelto, a partire dal centro pixel e spostandosi verso l'esterno.
  • La maschera di esempio disattiva tutti gli esempi, ma uno (uno scenario comune). Un'applicazione può implementare la supersampling multipass eseguendo il ciclismo attraverso valori di maschera di esempio a bit singolo e riprovare la scena per ogni campione usando il campionamento centroid. Ciò richiederebbe che un'applicazione regola i derivati per selezionare in modo appropriato gli errori di trama più dettagliati per la densità di campionamento più elevata della trama.

Calcoli derivati quando si esegue il multicampionamento

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

Se i derivati vengono richiesti su un attributo che è stato campionato al centro, il calcolo hardware non viene modificato, che può causare derivati non accurati. 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 campionati centroidi. In effetti, è consigliabile non combinare derivati e campionamento centroide. Il campionamento centroide 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 in cui un bordo primitivo attraversa un pixel (anziché modificare continuamente) o derivati che non possono essere usati dalle operazioni di campionamento delle trame che derivano LOD.

Fase Rasterizzazione