Rasterizzazione conservativa di Direct3D 11.3
La rasterizzazione conservativa aggiunge una certa certezza al rendering dei pixel, utile in particolare per gli algoritmi di rilevamento delle collisioni.
- panoramica
- Interazioni con la pipeline
- dettagli sull'implementazione
- riepilogo API
- argomenti correlati
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 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 di cui viene eseguito il 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 dell'incertezza. 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. Possono esserci falsi positivi (pixel impostati che non dovrebbero essere stati) che il sistema normalmente, ma non sempre cull.
Interazioni con la pipeline
Per molti dettagli sul modo in cui la rasterizzazione conservativa interagisce con la pipeline grafica, vedere rasterizzazione D3D12 conservativa.
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, tale 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 supporta aree di incertezza di 1/2 pixel e nessuna degenera 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 aggiunge degeneri post-snap e 1/256 aree di incertezza. Aggiunge anche il supporto per l'accelerazione dell'algoritmo basata sulla CPU , ad esempio la voxelizzazione.
- Il livello 3 aggiunge 1/512 aree di incertezza, copertura dell'input interno e supporta l'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 all'input di un pixel shader e rappresenta le informazioni di rasterizzazione conservativa sottovalutate (ovvero se un pixel è garantito,to-becompletamente coperto).
Riepilogo API
I metodi, le strutture, le enumerazioni e le classi helper seguenti fanno riferimento alla rasterizzazione conservativa:
- D3D11_RASTERIZER_DESC2 : struttura che contiene la descrizione del rasterizzatore, notando la classe helper CD3D12_RASTERIZER_DESC2 per la creazione di descrizioni del rasterizzatore.
- D3D11_CONSERVATIVE_RASTERIZATION_MODE : valori di enumerazione per la modalità (attivata o disattivata).
- D3D11_FEATURE_DATA_D3D11_OPTIONS2 : struttura che contiene il livello di supporto.
- D3D11_CONSERVATIVE_RASTERIZATION_TIER : valori di enumerazione per ogni livello di supporto da parte dell'hardware.
- ID3D11Device::CheckFeatureSupport : metodo per accedere alle funzionalità supportate.