Rasterizzazione conservativa direct3D 12

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

Panoramica

La rasterizzazione conservativa indica 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 la rasterizzazione conservativa è abilitata.

La rasterizzazione conservativa è utile in diverse situazioni, tra cui per certezza nel rilevamento delle collisioni, nel culling di occlusione e nel rendering affiancato.

La figura seguente, ad esempio, mostra un triangolo verde di cui viene eseguito il rendering usando la rasterizzazione conservativa, come appare nel rasterizzatore , ovvero usando le coordinate dei vertici a virgola fissa 16,8. L'area marrone è nota come "area di incertezza", ovvero 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 visualizzati usando la "Regola superiore sinistra", che entra in gioco quando il bordo del triangolo attraversa il bordo dei pixel. Ci possono essere falsi positivi (pixel impostati che non dovrebbero essere stati) che il sistema normalmente, ma non sempre cull.

regola in alto a sinistra

Interazioni con la pipeline

Interazione tra 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 di Top-Left, descritta in precedenza e la copertura pixel. 16.8 Fixed-Point deve essere utilizzata la precisione rasterizzatore.

I pixel che non verrebbero coperti se l'hardware usava coordinate dei vertici a virgola mobile complete possono essere inclusi solo se si trovano all'interno di un'area di incertezza senza una metà di pixel più grande 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 di scorrimento oltre il necessario.

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

Le aree di incertezza interna ed esterna devono essere maggiori o uguali alla dimensione della griglia sub-pixel o 1/512 di un pixel nel dominio a virgola fissa. Si tratta dell'area minima di incertezza valida. 1/512 deriva dalla rappresentazione di coordinate rasterizzatore a virgola fissa 16.8 e dalla regola da arrotondamento a più vicino che si applica 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, deve 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 di 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 tramite lo spazzamento di 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 sono basate sulle dimensioni valide dell'area di incertezza esterna: per il 1/2 di un pixel, il quadrato è di 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 punteggiata rossa rappresenta il limite sulla Rasterizzazione conservativa sovrastimata, i quadrati neri solidi rappresentano il quadrato che viene spazzato lungo i bordi primitivi e l'area a scacchi blu è l'area di incertezza esterna:

area di incertezza esterna.

Interazione multicampionamento

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

Interazione di esempioMask

Lo stato rasterizzatore SampleMask si applica allo stesso modo di quando la rasterizzazione conservativa non è abilitata per InputCoverage, ma non influisce InnerCoverage (ad esempio, non è AND'ed in un input dichiarato con InnerCoverage). Ciò è dovuto al fatto InnerCoverage che 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 vengano aggiornati campioni.

Interazione di test depth/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.

Se si procede con tutti i campioni coperti, l'estrapolazione profondità è valida e deve essere bloccata sul riquadro di visualizzazione come specificato quando la rasterizzazione conservativa non è abilitata. Questo comportamento è simile a quando le modalità di interpolazione a frequenza pixel vengono usate in un oggetto RenderTarget con numero di campioni maggiore di 1, anche se in caso di rasterizzazione conservativa, è il valore di profondità che passa al test di profondità della funzione fissa che può essere estrapolato.

Il comportamento di culling di profondità iniziale con l'estrapolazione di 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 min e max depth della primitiva da rasterizzare e scrivere tale valore in oDepth (il registro di profondità di output del pixel shader). In questo caso, le implementazioni sono necessarie per disabilitare il culling di profondità anticipata, a causa della oDepth scrittura.

Interazione del 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 InputCoverage sezione di interazione. Pertanto, i pixel completamente non coperti coprono la copertura 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 coperti.

Interazione 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 in modo conservativo. Vale a dire, tutte le interazioni esistenti si applicano (ad esempio , SampleMask viene applicato) e i primi n bit in InputCoverage dall'LSB sono impostati su 1 per un pixel rasterizzato in modo conservativo, dato un n campione per pixel RenderTarget e/o DepthStencil associato alla fusione di output o a un esempio 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 numero 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 il bit 0 non è impostato, ma non sono definiti quando bit 0 è impostato su 1 (essenzialmente, questo campo di bit rappresenta un valore booleano dove false deve essere esattamente 0, ma true può essere qualsiasi valore dispari (ad esempio 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 allineamento alle risoluzioni maggiori o uguali alla risoluzione in cui è operativo il disegno corrente. Non devono essere presenti falsi positivi (impostazione InnerCoverage dei bit quando il pixel non è completamente coperto per eventuali errori di ancoraggio a risoluzioni maggiori o uguali alla risoluzione in corrispondenza della quale funziona il disegno corrente), ma sono consentiti falsi negativi. In sintesi, l'implementazione non deve identificare erroneamente i pixel come completamente coperti che non sarebbero con coordinate dei vertici a virgola mobile complete nel rasterizzatore.

I pixel che verrebbero completamente coperti se l'hardware usava coordinate di vertice a virgola mobile completa possono essere omessi solo se intersecano l'area di incertezza interna, che non deve essere maggiore delle dimensioni della griglia del sotto pixel o 1/256 di un pixel, nel dominio del punto fisso. 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 dell'area di incertezza è illustrato nel diagramma sottostante dalla linea tratteggiata nera grassetto. 1/256 deriva dalla rappresentazione di coordinate 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 Rasterizer.

Qui si applicano anche gli stessi requisiti dell'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 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 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 limite dell'area di 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 dell'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 InputCoverage modalità non influisce sui pixel rasterizzati quando è abilitata la modalità di rasterizzazione conservativa. Pertanto, quando InnerCoverage viene usato e pixel shader elabora un pixel che non è completamente coperto dalla geometria il valore sarà 0, ma la chiamata pixel shader avrà campioni aggiornati. Ciò è diverso da quando InputCoverage è 0, ovvero nessun campione verrà aggiornato.

Questo input si escludono a vicenda con InputCoverage : non è possibile usare entrambi.

Per accedere InnerCoveragea , 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 InnerCoverage campo di bit non è influenzato dai test depth/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 InnerCoverage registro 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à orizzontale e convertita a virgola fissa. Poiché tutti i campioni in un pixel rasterizzato in modo conservativo vengono considerati coperti, è valido che i valori vengano estrapolati, in modo analogo a quando le modalità di interpolazione a frequenza pixel vengono usate in un oggetto RenderTarget con conteggio campioni maggiore di 1. Le modalità di interpolazione centroide producono risultati identici alla modalità di interpolazione non centroide corrispondente; la nozione di centroide è senza significato in questo scenario, dove 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 il clip di profondità è disabilitato (quando depthClipEnable Rasterizer State è impostato su FALSE), potrebbero esserci variazioni nell'interpolazione di attributi per segmenti di una primitiva che non rientrano nell'intervallo 0 <= z <= w, a seconda dell'implementazione: entrambi 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à rasterizzazione conservativa, ovvero le primitive che non rientrano nell'intervallo di profondità devono comunque essere date il 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 in modo conservativo, perché 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'esecuzione di implementazioni clip distance per pixel su una distanza clip che è stata prospettiva divisa per un valore W non valido. Le implementazioni clip distance devono proteggersi dalla richiamare la 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 con topologia primitiva IA

La rasterizzazione conservativa non è definita per le primitive di linea o punto. Pertanto, topologie primitive che specificano punti o linee producono un comportamento indefinito 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 rasterizzato in modo conservativo, 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 coperti tutti i campioni.

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

Interazione 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 rivolta verso il retro, l'altra fronte anteriore). Le applicazioni possono evitare questa incertezza usando D3D12_CULL_MODE_NONE (da D3D12_CULL_MODE) e non usando il IsFrontFace valore generato dal sistema.

Interazione isFrontFace

Il IsFrontFace valore generato dal sistema è 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'unica D3D12_FILL_MODE valida 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 wireframe deve convertire i bordi del triangolo in linee e seguire le regole di rasterizzazione delle linee e il comportamento di rasterizzazione linea conservativa non è stato definito.

Dettagli dell'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 vengono 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 viene 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 primitivi intrinseci nelle coordinate dei vertici a virgola fissa usate nella rasterizzazione. Il motivo per cui i falsi positivi (rispetto alle coordinate dei vertici a virgola fissa) sono validi perché è necessaria una certa quantità di falsi positivi per consentire a un'implementazione di eseguire una valutazione della copertura rispetto ai vertici post-troncato (ovvero le coordinate dei vertici che sono state convertite dal punto 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 primitive post-snap non degenerate: se una parte di una primitiva si sovrappone a qualsiasi parte di un pixel, tale pixel viene rasterizzato.

I triangoli che vengono 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 o non essere codificati; entrambi sono comportamenti validi. I triangoli degenerati devono essere considerati rivolti verso il retro, quindi se un comportamento specifico è richiesto da un'applicazione, può usare la culling posteriore 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 massima di incertezza di 1/2 pixel e non supporta degenerazioni post-snap. Questo è 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 codificate. 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 sull'input di un pixel shader e rappresenta le informazioni di rasterizzazione conservativa sottovalutate, ovvero se un pixel è completamente coperto. Questo livello è utile per l'occlusione.

Riepilogo dell'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