Rasterizzazione conservativa direct3D 11.3

La rasterizzazione conservativa aggiunge certezza al rendering dei 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 di cui è stato eseguito il rendering vengono rasterizzati, il che significa che viene richiamato lo shader pixel. 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, nell'occlusione e nel rilevamento della visibilità.

Ad esempio, la figura seguente mostra un triangolo verde sottoposto a rendering usando la rasterizzazione conservativa. L'area marrone è nota come "area di incertezza" - un'area in cui gli errori di arrotondamento e altri problemi aggiungono alcune incertezze alle dimensioni esatte del triangolo. I triangoli rossi in ogni vertice mostrano come viene calcolata l'area di incertezza. I quadrati grigi di grandi dimensioni mostrano i pixel che verranno visualizzati. I quadrati rosa mostrano pixel visualizzati usando la "regola superiore sinistra", che entra in gioco come bordo del triangolo attraversa il bordo dei pixel. Possono esserci falsi positivi (set di pixel che non dovrebbero essere stati) che il sistema normalmente ma non sempre cull.

shows the top left rule

Interazioni con la pipeline

Per molti dettagli su come la rasterizzazione conservativa interagisce con la pipeline grafica, vedere Rasterization D3D12 Conservativa.

Dettagli dell'implementazione

Il tipo di rasterizzazione supportato in Direct3D 12 è talvolta definito "rasterizzazione sovrastimata". Esiste anche il concetto di "rasterizzazione conservativa sottovalutata", ovvero solo i pixel completamente coperti da una primitiva di cui è stato eseguito il rendering vengono rasterizzati. Le informazioni di rasterizzazione conservativa sottovalutate sono disponibili tramite lo shader pixel 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 si trova 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 hardware diverso e producono falsi positivi, ovvero che possono decidere in modo errato che i pixel siano coperti. Ciò può verificarsi a causa di dettagli specifici dell'implementazione, ad esempio errori di crescita primitiva o di snapping intrinseci nelle coordinate del vertice a virgola fissa usate nella rasterizzazione. Il motivo per cui sono validi i falsi positivi (rispetto alle coordinate del vertice a virgola fissa) è valido perché è necessaria una quantità di falsi positivi per consentire a un'implementazione di eseguire una valutazione di copertura rispetto ai vertici post-snapped ,ad esempio le coordinate del vertice a virgola mobile convertite dal punto mobile alla 16.8 virgola fissa usata nel rasterizzatore, ma rispettare la copertura prodotta dalle coordinate del vertice a virgola mobile originale.

Le implementazioni di rasterizzazione conservative non producono falsi negativi rispetto alle coordinate del vertice a virgola mobile per le 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 rasterizer), possono o non essere eliminati; entrambi sono comportamenti validi. I triangoli degenerati devono essere considerati di fronte, quindi se un comportamento specifico è richiesto da un'applicazione, può usare la culling sul retro o testare per il fronte. 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 supporta aree di incertezza da 1/2 pixel e nessun degenerato post-snap. Questo è utile per il rendering riquadri, un atlas trama, la generazione della mappa leggera e le mappe ombreggiatura sub-pixel.
  • Il livello 2 aggiunge degenerati post-snap e 1/256 aree di incertezza. Aggiunge anche il supporto per l'accelerazione degli algoritmi basati sulla CPU , ad esempio voxelization.
  • Il livello 3 aggiunge 1/512 aree di incertezza, copertura di input interno e supporta l'esecuzione dell'occlusione. La copertura di input 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 nell'input di un pixel shader e rappresenta le informazioni di rasterizzazione conservativa sottostimate, ovvero se un pixel è garantito completamente coperto.

Riepilogo dell'API

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