Condividi tramite


Rasterizzazione conservativa di Direct3D 12

La rasterizzazione conservativa aggiunge una certa certezza al rendering dei pixel, utile in particolare per gli algoritmi di rilevamento delle collisioni.

Panoramica

La rasterizzazione conservativa significa che tutti i pixel che sono almeno parzialmente coperti da una primitiva sottoposta a rendering vengono rasterizzati, il che significa che viene richiamato il pixel shader. Il comportamento normale è il campionamento, che non viene usato se è abilitata la rasterizzazione conservativa.

La rasterizzazione conservativa è utile in una serie di situazioni, tra cui per certezza nel rilevamento delle collisioni, nell'occlusione e nel rendering affiancato.

Ad esempio, la figura seguente mostra un triangolo verde di cui viene eseguito il rendering usando la rasterizzazione conservativa, come appare nel rasterizzatore (ovvero usando coordinate di vertice a 16,8 punti fissi). L'area marrone è nota come "area di incertezza" - un'area concettuale che rappresenta i limiti estesi del triangolo, necessaria per garantire che la primitiva nel rasterizzatore sia conservativa rispetto alle coordinate dei vertici a virgola mobile originali. I quadrati rossi in ogni vertice mostrano come viene calcolata l'area dell'incertezza: come quadrato spazzato.

I quadrati grigi grandi mostrano i pixel di cui verrà eseguito il rendering. I quadrati rosa mostrano i pixel di cui viene eseguito il rendering usando la "regolaTop-Left", che entra in gioco quando il bordo del triangolo attraversa il bordo dei pixel. Possono esserci falsi positivi (pixel impostati che non dovrebbero essere stati) che il sistema normalmente, ma non sempre cull.

la regola in alto a sinistra

Interazioni con la pipeline

Interazione delle regole di rasterizzazione

In modalità rasterizzazione conservativa, le regole di rasterizzazione si applicano allo stesso modo di quando la modalità rasterizzazione conservativa non è abilitata con eccezioni per la regola Top-Left, descritta in precedenza e pixel coverage. 16.8 Fixed-Point deve essere usata la precisione rasterizzatore.

I pixel che non verrebbero coperti se l'hardware usava coordinate di vertice a virgola mobile complete possono essere inclusi solo se si trovano all'interno di un'area di incertezza senza una metà di pixel maggiore nel dominio a virgola fissa. L'hardware futuro dovrebbe raggiungere l'area di incertezza stretta specificata nel livello 2. Si noti che questo requisito impedisce l'estensione dei triangoli sliver oltre il necessario.

Un'area di incertezza valida simile si applica anche a InnerCoverage, ma è più stretta poiché nessuna implementazione richiede un'area di incertezza più ampia per questo caso. Per altri dettagli, vedere di interazione di InnerCoverage.

Le aree di incertezza interna ed esterna devono essere maggiori o uguali alla dimensione della metà della griglia dei sub-pixel o 1/512 di un pixel nel dominio a virgola fissa. Si tratta dell'area di incertezza minima valida. 1/512 deriva dalla rappresentazione della coordinata rasterizzatore a 16,8 punti fissi e dalla regola da arrotondamento a più vicino applicabile durante la conversione delle coordinate dei vertici a virgola mobile in coordinate a 16,8 punti fissi. 1/512 può cambiare se la precisione del rasterizzatore cambia. Se un'implementazione implementa questa area di incertezza minima, è necessario seguire la regola Top-Left quando un bordo o un angolo dell'area di incertezza cade lungo il bordo o l'angolo di un pixel. I bordi ritagliati dell'area di incertezza devono essere considerati come il vertice più vicino, vale a dire che conta come due archi: i due che si uniscono al vertice associato. Top-Left Regola è necessaria quando viene usata l'area di incertezza minima perché, in caso contrario, un'implementazione della rasterizzazione conservativa non riuscirà a rasterizzare i pixel che potrebbero essere coperti quando la modalità rasterizzazione conservativa è disabilitata.

Il diagramma seguente illustra un'area di incertezza esterna valida prodotta spazzando un quadrato attorno ai bordi della primitiva nel dominio a virgola fissa (ovvero i vertici sono stati quantizzati dalla rappresentazione a virgola fissa 16,8). Le dimensioni di questo quadrato si basano sulle dimensioni valide dell'area di incertezza esterna: per 1/2 di un pixel, il quadrato è 1 pixel in larghezza e altezza, per 1/512 di un pixel, il quadrato è 1/256 di un pixel in larghezza e altezza. Il triangolo verde rappresenta una determinata primitiva, la linea rossa punteggiata rappresenta il limite sulla rasterizzazione conservativa sovrastimata, i quadrati neri solidi rappresentano il quadrato che viene spazzato lungo i bordi primitivi e l'area blu a scacchi è l'area di incertezza esterna:

'area di incertezza esterna.

Interazione multicampionamento

Indipendentemente dal numero di campioni in RenderTarget/DepthStencil superfici (o se forcedSampleCount viene usato o meno), tutti i campioni vengono trattati per i pixel rasterizzati dalla rasterizzazione conservativa. I singoli percorsi di esempio non vengono testati per verificare se rientrano nella primitiva o meno.

Interazione di esempiomask

L'SampleMask Stato rasterizzatore si applica allo stesso modo di quando la rasterizzazione conservativa non è abilitata per InputCoverage, ma non influisce sul InnerCoverage (ovvero non è AND'ed in un input dichiarato con InnerCoverage). Ciò è dovuto al fatto che InnerCoverage non è correlato al fatto che i campioni MSAA siano mascherati: 0 InnerCoverage significa solo che il pixel non è garantito che sia completamente coperto, non che non venga aggiornato alcun campione.

Interazione di test di profondità/stencil

Il test depth/stencil procede per un pixel rasterizzato in modo conservativo come se tutti i campioni siano coperti quando la rasterizzazione conservativa non è abilitata.

Procedere con tutti i campioni trattati può causare l'estrapolazione profondità, valida e deve essere bloccata al riquadro di visualizzazione come specificato quando la rasterizzazione conservativa non è abilitata. Questo comportamento è simile a quando vengono usate le modalità di interpolazione a frequenza di pixel in un RenderTarget con conteggio dei campioni maggiore di 1, anche se nel caso della rasterizzazione conservativa, si tratta del valore di profondità della funzione fissa che può essere estrapolato.

Il comportamento di culling di profondità precoce con l'estrapolazione profondità non è definito. Ciò è dovuto al fatto che alcuni componenti hardware di analisi approfondita anticipata non possono supportare correttamente i valori di profondità estrapolati. Tuttavia, il comportamento di culling di profondità anticipata in presenza di estrapolazione profondità è problematico anche con l'hardware che può supportare valori di profondità estrapolati. Questo problema può essere risolto bloccando la profondità di input pixel shader ai valori di profondità min e max della primitiva da rasterizzare e scrivere tale valore in oDepth (il registro di profondità dell'output del pixel shader). Le implementazioni sono necessarie per disabilitare il culling early depth in questo caso, a causa della oDepth scrittura.

Interazione pixel helper

Le regole helper Pixel si applicano allo stesso modo di quando la rasterizzazione conservativa non è abilitata. Come parte di questo, tutti i pixel inclusi i pixel helper devono segnalare InputCoverage accuratamente come specificato nella sezione di interazione InputCoverage. Quindi, la copertura dei pixel non coperti è 0.

Interazione di output coverage

La copertura di output (oMask) si comporta per un pixel rasterizzato in modo conservativo, perché quando la rasterizzazione conservativa non è abilitata con tutti i campioni trattati.

Interazione di InputCoverage

In modalità rasterizzazione conservativa questo registro di input viene popolato come se tutti i campioni siano coperti quando la rasterizzazione conservativa non è abilitata per un determinato pixel rasterizzato conservativo. Vale a dire, tutte le interazioni esistenti si applicano (ad esempio, viene applicato il SampleMask) e i primi n bit in InputCoverage da LSB sono impostati su 1 per un pixel con rasterizzazione conservativa, dato un campione n per pixel RenderTarget e/o DepthStencil buffer associato al Unione outputo un esempio n ForcedSampleCount. Il resto dei bit è 0.

Questo input è disponibile in uno shader indipendentemente dall'uso della rasterizzazione conservativa, anche se la rasterizzazione conservativa modifica il suo comportamento in modo da mostrare solo tutti i campioni coperti (o nessuno per i pixel helper).

Interazione innercoverage

Questa funzionalità è richiesta da e disponibile solo nel livello 3. Il runtime non riuscirà a creare shader per gli shader che usano questa modalità quando un'implementazione supporta un livello inferiore al livello 3.

Pixel Shader dispone di un intero scalare a 32 bit Disponibile: InnerCoverage. Si tratta di un campo di bit con bit 0 dal LSB impostato su 1 per un determinato pixel rasterizzato in modo conservativo, solo quando tale pixel è garantito che sia interamente all'interno della primitiva corrente. Tutti gli altri bit del registro di input devono essere impostati su 0 quando bit 0 non è impostato, ma non sono definiti quando bit 0 è impostato su 1 (essenzialmente questo campo di bit rappresenta un valore booleano in cui false deve essere esattamente 0, ma true può essere qualsiasi valore dispari (ovvero bit 0 impostato) diverso da zero. Questo input viene usato per informazioni di rasterizzazione conservativa sottovalutate. Informa il Pixel Shader se il pixel corrente si trova completamente all'interno della geometria.

Questo deve tenere conto dell'errore di aggancio alle risoluzioni maggiori o uguali alla risoluzione in corrispondenza della quale è in funzione il disegno corrente. Non devono essere presenti falsi positivi (l'impostazione di InnerCoverage bit quando il pixel non è completamente coperto per eventuali errori di snapping a risoluzioni maggiori o uguali alla risoluzione in cui è in funzione l'oggetto Draw corrente), ma sono consentiti falsi negativi. In sintesi, l'implementazione non deve identificare erroneamente i pixel come completamente coperti che non sarebbero con coordinate di vertice a virgola mobile complete nel rasterizzatore.

I pixel che verrebbero completamente coperti se l'hardware usasse coordinate di vertice a virgola mobile completa possono essere omessi solo se si intersecano l'area di incertezza interna, che non deve essere maggiore delle dimensioni della griglia dei sub pixel o 1/256 di un pixel, nel dominio a virgola fissa. Detto un altro modo, i pixel interamente all'interno del confine interno della regione dell'incertezza interna devono essere contrassegnati come completamente coperti. Il confine interno della regione dell'incertezza è illustrato nel diagramma sottostante dalla linea tratteggiata in grassetto nero. 1/256 deriva dalla rappresentazione della coordinata rasterizzatore a 16,8 punti fissi, che può cambiare se la precisione rasterizzatore cambia. Questa area di incertezza è sufficiente per tenere conto dell'errore di allineamento causato dalla conversione delle coordinate dei vertici a virgola mobile in coordinate dei vertici a virgola fissa nel rasterizzatore.

Qui si applicano anche gli stessi requisiti di area di incertezza minima definiti nell'interazione con le regole di rasterizzazione.

Il diagramma seguente illustra un'area di incertezza interna valida prodotta spazzando un quadrato intorno ai bordi della primitiva nel dominio a virgola fissa (ovvero i vertici sono stati quantizzati dalla rappresentazione a virgola fissa 16,8). Le dimensioni di questo quadrato sono basate sulle dimensioni valide dell'area di incertezza interna: per 1/256 di un pixel, il quadrato è 1/128 di un pixel in larghezza e altezza. Il triangolo verde rappresenta una determinata primitiva, la linea tratteggiata in grassetto nero rappresenta il confine della regione dell'incertezza interna, i quadrati neri solidi rappresentano il quadrato che viene spazzato lungo i bordi primitivi e l'area a scacchi arancione è l'area di incertezza interna:

reqion di incertezza interna.

L'uso di InnerCoverage non influisce sul fatto che un pixel sia rasterizzato in modo conservativo, ovvero l'uso di una di queste modalità di InputCoverage non influisce sui pixel rasterizzati quando è abilitata la modalità rasterizzazione conservativa. Pertanto, quando si usa InnerCoverage e pixel shader elabora un pixel che non è completamente coperto dalla geometria il relativo valore sarà 0, ma la chiamata pixel shader avrà campioni aggiornati. Ciò è diverso da quando InputCoverage è 0, vale a dire che non verranno aggiornati esempi.

Questo input si escludono a vicenda con InputCoverage : entrambi non possono essere usati.

Per accedere a InnerCoverage, deve essere dichiarato come singolo componente da uno dei registri di input di Pixel Shader. La modalità di interpolazione nella dichiarazione deve essere costante (l'interpolazione non è applicabile).

Il campo di bit InnerCoverage non è interessato da test di profondità/stencil, né è ANDed con lo stato SampleMask Rasterizer.

Questo input è valido solo in modalità rasterizzazione conservativa. Quando la rasterizzazione conservativa non è abilitata, InnerCoverage produce un valore non definito.

Le chiamate pixel shader causate dalla necessità di Helper Pixel, ma altrimenti non coperte dalla primitiva, devono avere il registro InnerCoverage impostato su 0.

Interazione con l'interpolazione degli attributi

Le modalità di interpolazione degli attributi sono invariate e procedono allo stesso modo di quando la rasterizzazione conservativa non è abilitata, in cui vengono usati i vertici con scalabilità del riquadro di visualizzazione e convertita a virgola fissa. Poiché tutti i campioni in un pixel con rasterizzazione conservativa vengono considerati coperti, è valido che i valori vengano estrapolati, in modo analogo a quando vengono usate modalità di interpolazione a frequenza di pixel in un RenderTarget con numero di campioni maggiore di 1. Le modalità di interpolazione centroidi producono risultati identici alla modalità di interpolazione non centroide corrispondente; il concetto di centroide non ha significato in questo scenario, in cui la copertura del campione è solo completa o 0.

La rasterizzazione conservativa consente di degenerare i triangoli per produrre chiamate pixel shader, pertanto i triangoli degenerati devono usare i valori assegnati a Vertex 0 per tutti i valori interpolati.

Interazione di ritaglio

Quando la modalità rasterizzazione conservativa è abilitata e la clip di profondità è disabilitata (quando la DepthClipEnable Stato rasterizzatore è impostata su FALSE), potrebbero esserci varianza nell'interpolazione degli attributi per segmenti di una primitiva che non rientra nell'intervallo 0 <= z <= w, a seconda dell'implementazione: i valori costanti vengono usati da un punto in cui la primitiva interseca il piano pertinente (vicino o lontano), o l'interpolazione degli attributi si comporta come quando la modalità di rasterizzazione conservativa è disabilitata. Tuttavia, il comportamento del valore di profondità è lo stesso indipendentemente dalla modalità di rasterizzazione conservativa, ovvero le primitive che rientrano all'esterno dell'intervallo di profondità devono comunque essere date al valore del limite più vicino dell'intervallo di profondità del riquadro di visualizzazione. Il comportamento di interpolazione degli attributi all'interno dell'intervallo 0 <= z <= w deve rimanere invariato.

Interazione clip distance

Clip Distance è valido quando è abilitata la modalità di rasterizzazione conservativa e si comporta per un pixel rasterizzato conservativo, così come quando la rasterizzazione conservativa non è abilitata con tutti i campioni coperti.

Si noti che la rasterizzazione conservativa può causare l'estrapolazione della coordinata del vertice W, che può causare W <= 0. Ciò potrebbe causare l'uso delle implementazioni di Clip Distance per pixel su una distanza clip che è stata prospettiva divisa per un valore W non valido. Le implementazioni di Clip Distance devono proteggersi dalla richiamo della rasterizzazione per i pixel in cui la coordinata del vertice W <= 0 (ad esempio a causa dell'estrapolazione in modalità rasterizzazione conservativa).

Interazione di rasterizzazione indipendente di destinazione

La modalità rasterizzazione conservativa è compatibile con la rasterizzazione indipendente di destinazione (TIR). Si applicano regole e restrizioni di TIR, comportandosi per un pixel rasterizzato in modo conservativo come se tutti i campioni siano coperti.

Interazione della topologia primitiva IA

La rasterizzazione conservativa non è definita per le primitive di linea o di punto. Pertanto, topologie primitive che specificano punti o linee producono un comportamento non definito se vengono inseriti nell'unità rasterizzatore quando è abilitata la rasterizzazione conservativa.

La convalida del livello di debug verifica che le applicazioni non usino queste topologie primitive.

Interazione tra query

Per un pixel con rasterizzazione conservativa, le query si comportano come quando la rasterizzazione conservativa non è abilitata quando vengono trattati tutti i campioni. Ad esempio, per un pixel con rasterizzazione conservativa, D3D12_QUERY_TYPE_OCCLUSION e D3D12_QUERY_TYPE_PIPELINE_STATISTICS (da D3D12_QUERY_TYPE) devono comportarsi come quando la rasterizzazione conservativa non è abilitata quando vengono trattati tutti i campioni.

Le chiamate di Pixel Shader devono incrementare per ogni pixel rasterizzato in modo conservativo in modalità rasterizzazione conservativa.

Interazione con stato Cull

Tutti gli stati Cull sono validi in modalità rasterizzazione conservativa e seguono le stesse regole di quando la rasterizzazione conservativa non è abilitata.

Quando si confronta la rasterizzazione conservativa tra risoluzioni o senza rasterizzazione conservativa abilitata, c'è la possibilità che alcune primitive abbiano una faccia insodparabile (ad esempio una faccia posteriore, l'altra fronte anteriore). Le applicazioni possono evitare questa incertezza usando D3D12_CULL_MODE_NONE (da D3D12_CULL_MODE) e non usando il valore generato dal sistema IsFrontFace.

Interazione isFrontFace

Il valore generato dal sistema IsFrontFace è valido per l'uso in modalità rasterizzazione conservativa e segue il comportamento definito quando la rasterizzazione conservativa non è abilitata.

Interazione tra modalità di riempimento

L'unico D3D12_FILL_MODE valido per la rasterizzazione conservativa è D3D12_FILL_SOLID, qualsiasi altra modalità di riempimento è un parametro non valido per lo stato rasterizzatore.

Ciò è dovuto al fatto che la specifica funzionale D3D12 specifica che la modalità di riempimento del wireframe deve convertire i bordi dei triangoli in linee e seguire le regole di rasterizzazione delle linee e il comportamento di rasterizzazione lineare conservativo non è stato definito.

Dettagli di implementazione

Il tipo di rasterizzazione supportata in Direct3D 12 viene talvolta definito "Rasterizzazione conservativa sovrastimata". Esiste anche il concetto di "Rasterizzazione conservativa sottovalutata", il che significa che solo i pixel completamente coperti da una primitiva sottoposta a rendering sono rasterizzati. Le informazioni di rasterizzazione conservativa sottovalutate sono disponibili tramite il pixel shader tramite l'uso dei dati di copertura di input e solo la rasterizzazione conservativa sovrastimata è disponibile come modalità di rasterizzazione.

Se una parte di una primitiva si sovrappone a un pixel, tale pixel viene considerato coperto e quindi rasterizzato. Quando un bordo o un angolo di una primitiva cade lungo il bordo o l'angolo di un pixel, l'applicazione della "regola in alto a sinistra" è specifica dell'implementazione. Tuttavia, per le implementazioni che supportano triangoli degenerati, un triangolo degenerato lungo un bordo o un angolo deve coprire almeno un pixel.

Le implementazioni di rasterizzazione conservativa possono variare in base a hardware diverso e producono falsi positivi, vale a dire che possono decidere erroneamente che i pixel sono coperti. Ciò può verificarsi a causa di dettagli specifici dell'implementazione, ad esempio errori di espansione o snapping intrinseci nelle coordinate dei vertici a virgola fissa usate nella rasterizzazione. Il motivo dei falsi positivi (rispetto alle coordinate dei vertici a virgola fissa) è valido perché è necessaria una certa quantità di falsi positivi per consentire a un'implementazione di eseguire la valutazione della copertura rispetto ai vertici post-snapped (ovvero le coordinate dei vertici che sono state convertite dal virgola mobile al 16,8 a virgola fissa usata nel rasterizzatore), ma rispettano la copertura prodotta dalle coordinate dei vertici a virgola mobile originali.

Le implementazioni di rasterizzazione conservativa non producono falsi negativi rispetto alle coordinate dei vertici a virgola mobile per le primitive post-snap non degenerate: se una parte di una primitiva si sovrappone a qualsiasi parte di un pixel, il pixel viene rasterizzato.

I triangoli degenerati (indici duplicati in un buffer di indice o collineari in 3D) o diventano degenerati dopo la conversione a virgola fissa (vertici collineari nel rasterizzatore), possono essere o meno rimossi; entrambi sono comportamenti validi. I triangoli degenerati devono essere considerati rivolti all'indietro, quindi se un comportamento specifico è richiesto da un'applicazione, può usare la culling sul retro o testare la fronte anteriore. I triangoli degenerati usano i valori assegnati a Vertex 0 per tutti i valori interpolati.

Sono disponibili tre livelli di supporto hardware, oltre alla possibilità che l'hardware non supporti questa funzionalità.

  • Il livello 1 applica un'area di incertezza massima di 1/2 pixel e non supporta le degenerazioni post-snap. Ciò è utile per il rendering affiancato, un atlas delle trame, la generazione della mappa chiara e le mappe ombreggiature sub-pixel.
  • Il livello 2 riduce l'area di incertezza massima a 1/256 e richiede la degenerazioni post-snap non essere risolte. Questo livello è utile per l'accelerazione dell'algoritmo basato sulla CPU, ad esempio la voxelizzazione.
  • Il livello 3 mantiene un'area di incertezza massima di 1/256 e aggiunge il supporto per la copertura interna dell'input. La copertura di input interno aggiunge il nuovo valore SV_InnerCoverage a High Level Shading Language (HLSL). Si tratta di un intero scalare a 32 bit che può essere specificato all'input di un pixel shader e rappresenta le informazioni di rasterizzazione conservativa sottovalutate (ovvero se un pixel è garantito,to-becompletamente coperto). Questo livello è utile per l'occlusione.

Riepilogo API

I metodi, le strutture, le enumerazioni e le classi helper seguenti fanno riferimento alla rasterizzazione conservativa:

esercitazioni video di apprendimento avanzato DirectX: Rasterizzazione conservativa

viste ordinate rasterizzatori

Rendering