Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Le regole di rasterizzazione definiscono la modalità di mapping dei dati vettoriali nei dati raster. I dati raster vengono allineati a coordinate intere, quindi sottoposti a culling e clipping (per disegnare il numero minimo di pixel), mentre gli attributi per pixel vengono interpolati (a partire dagli attributi per vertice) prima di essere passati a un pixel shader.
Esistono diversi tipi di regole, che dipendono dal tipo di primitiva di cui viene eseguito il mapping, nonché dal fatto che i dati usino o meno il multicampionamento per ridurre l'aliasing. Le illustrazioni seguenti mostrano come sono gestiti i casi limite.
Annotazioni
Queste regole di rasterizzazione Direct3D si applicano alle app indipendentemente dal fatto che usino il modello di app Win32 o UWP.
- Regole di Rasterizzazione dei Triangoli (Senza Multicampionamento)
- Regole di rasterizzazione delle linee (con aliasing, senza multicampionamento)
- Regole di rasterizzazione delle linee (con antialiasing, senza multicampionamento)
- Regole di rasterizzazione dei punti (senza multicampionamento)
- Regole di rasterizzazione con anti-aliasing multisample
- argomenti correlati
Regole di rasterizzazione dei triangoli (senza multicampionamento)
Qualsiasi centro di un pixel che si trova all'interno di un triangolo viene tracciato; un pixel è considerato all'interno se soddisfa la regola dell'angolo superiore sinistro. La regola superiore sinistra è che un centro pixel è definito per trovarsi all'interno di un triangolo se si trova sul bordo superiore mentre non si trova su un bordo destro o se si trova su un bordo sinistro mentre non si trova sul bordo inferiore.
Dove:
- Un bordo superiore, è un bordo che è esattamente orizzontale e si trova sopra gli altri bordi.
- Un bordo inferiore, è un bordo che è esattamente orizzontale ed è sotto gli altri bordi.
- Un bordo sinistro, è un bordo che non è esattamente orizzontale ed è sul lato sinistro del triangolo. Un triangolo può avere uno o due bordi sinistro.
- Un bordo destro, è un bordo che non è esattamente orizzontale ed è sul lato destro del triangolo. Un triangolo può avere uno o due bordi destro.
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.
L'ombreggiatura grigio chiaro e grigio scuro dei pixel li mostra come gruppi di pixel per indicare all'interno di quale triangolo si trovano.
Regole di rasterizzazione delle linee (con aliasing, 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 del diamante include (mostrato solido) il bordo inferiore sinistro, il bordo inferiore destro e l'angolo inferiore; 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 a diamante, una retta copre un pixel se esce dall'area di test a diamante del pixel percorrendola dal punto iniziale a quello finale. Una striscia di linee si comporta allo stesso modo, poiché è disegnata come una sequenza di linee.
La figura seguente illustra alcuni esempi.
Regole di rasterizzazione delle linee (con antialiasing, senza multicampionamento)
Una linea antialiased viene rasterizzata come se fosse un rettangolo (con larghezza = 1). Il rettangolo interseca un target di rendering producendo valori di copertura per pixel, che vengono moltiplicati per le componenti alfa dell'output del pixel shader. Non viene eseguito alcun anti-aliasing quando si disegnano linee su una destinazione di rendering multisample.
Si ritiene che non esista un unico modo "migliore" per eseguire il rendering delle linee antialiased. Direct3D 10 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 queste 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.
Questo algoritmo genera linee relativamente uniformi, con intensità uniforme, con bordi frastagliati minimi o treccia. L'effetto moiré nelle linee ravvicinate è ridotto al minimo. Esiste una buona copertura per le giunzioni tra segmenti di linea posizionati 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 di unione dell'output: 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 è previsto il culling dei punti.
La figura seguente illustra alcuni esempi.
di rasterizzazione dei punti
Regole di rasterizzazione del multisample anti-aliasing
L'anti-aliasing multisample (MSAA) riduce l'aliasing della geometria utilizzando i test di copertura dei pixel e di profondità-stencil in più punti di sottocampionamento. Per migliorare le prestazioni, i calcoli per pixel vengono eseguiti una volta per ogni pixel coperto, condividendo gli output dello shader tra sub-pixel coperti. L'anti-aliasing multisample non riduce l'aliasing sulle superfici. Le posizioni di esempio e le funzioni di ricostruzione dipendono dall'implementazione hardware.
La figura seguente illustra alcuni esempi.
Il numero di posizioni di campionamento dipende dalla modalità di multisampling. 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). Nel pixel shader, gli attributi possono essere contrassegnati per essere campionati al centroide, il che fa sì che, per i pixel non coperti, l'attributo venga interpolato nel punto di intersezione tra l'area del pixel e la primitiva. Uno pixel shader viene eseguito per ogni area di 2x2 pixel per supportare i calcoli delle derivate (che utilizzano i delta di x e y). Ciò significa che le chiamate dello shader si verificano più di quanto venga mostrato per compilare il minimo 2x2 quanti (che è indipendente dal multicampionamento). Il risultato dello shader viene scritto per ogni campione coperto che supera il test depth-stencil 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 di campionamento, un pixel shader viene eseguito una sola volta con attributi interpolati al centro del pixel. Il risultato viene archiviato (replicato) per ogni posizione del campione coperta nel pixel che supera il test depth/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).
Molti formati supportano il multicampionamento (vedere supporto hardware per formati Direct3D 10), alcuni formati possono essere risolti (ResolveSubresource, che esegue il downcampionamento di un formato multicampionato a una dimensione di campione pari a 1). I formati di multicampionamento possono essere usati nei target di rendering che possono essere letti dagli shader usando load, poiché non è necessaria alcuna operazione di resolve per i singoli campioni a cui accede lo 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 privi di tipo (R8G8B8A8_TYPELESS, ad esempio) supportano il multicampionamento per consentire a una vista della risorsa di interpretare i dati in modi diversi. Ad esempio, è possibile creare una risorsa multisample usando R8G8B8A8_TYPELESS, eseguire il rendering sulla stessa usando una risorsa di vista della destinazione di rendering con formato R8G8B8A8_UINT, quindi risolverne il contenuto in un'altra risorsa con formato 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à pari a 0 indica che l'hardware non supporta il multicampionamento (per un determinato 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. È anche possibile presupporre quanto segue:
- Qualsiasi formato compatibile con il multicampionamento supporta lo stesso numero di livelli di qualità per tutti i formati di quella famiglia.
- Ogni formato che supporta il multisampling e che è disponibile nei formati _UNORM, _SRGB, _SNORM o _FLOAT supporta anche l’operazione di resolve.
Campionamento al centroide degli attributi con antialiasing multisample
Per impostazione predefinita, gli attributi dei vertici vengono interpolati al centro del pixel durante l'anti-aliasing multisample; se il centro del pixel non è coperto, gli attributi vengono estrapolati al centro del 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 esempio coperte. Prima del calcolo centroide viene applicata una maschera di esempio (specificata dallo stato del rasterizzatore). Pertanto, un campione escluso tramite mascheratura non verrà usato come posizione del centroide.
Il rasterizzatore di riferimento sceglie una posizione di esempio per il campionamento centroide simile al seguente:
- La maschera di esempio consente tutti gli esempi. 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 campionamento disattiva tutti i campioni tranne uno (uno scenario comune). Un'applicazione può implementare il supercampionamento multipass scorrendo i valori della maschera di campionamento a bit singolo ed eseguendo nuovamente il rendering della scena per ciascun campione usando il campionamento al centroide. Ciò richiederebbe che un'applicazione regoli i derivati per selezionare in modo appropriato livelli mip della texture più dettagliati in presenza di una maggiore densità di campionamento della texture.
Calcolo delle derivate 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 non è influenzato dal multisampling.
Se vengono richieste derivate su un attributo campionato rispetto al centroide, il calcolo eseguito dall'hardware non viene adattato, il che può causare derivate imprecise. Uno shader si aspetta un vettore unitario nello spazio del target di rendering, ma potrebbe ricevere un vettore non unitario rispetto a un altro spazio vettoriale. Pertanto, spetta all'applicazione usare cautela quando richiede derivate da attributi campionati al centroide. Infatti, si consiglia di non combinare le derivate e il campionamento al centroide. Il campionamento al centroide può essere utile nei casi in cui è fondamentale che gli attributi interpolati di una primitiva non vengano estrapolati, ma ciò comporta anche degli svantaggi, ad esempio attributi che sembrano subire salti quando il bordo di una primitiva attraversa un pixel (anziché variare in modo continuo) o derivate che non possono essere utilizzate dalle operazioni di campionamento delle texture che ricavano il LOD dalle derivate.
Argomenti correlati