Rasterizzazione conservativa direct3D 11.3
La rasterizzazione conservativa aggiunge qualche certezza al rendering in pixel, utile in particolare per gli algoritmi di rilevamento delle collisioni.
- Panoramica
- Interazioni con la pipeline
- Dettagli di 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 di 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. Ci possono essere 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 conservativa D3D12.
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 conservative 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 supporta aree di incertezza di 1/2 pixel e non genera 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 aggiunge degenerazioni post-snap e aree di incertezza 1/256. 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 la culling 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 sottovalutate, ovvero se un pixel è completamente coperto.
Riepilogo dell'API
I metodi, le strutture, le enumerazioni e le classi helper seguenti fanno riferimento alla rasterizzazione conservativa:
- D3D11_RASTERIZER_DESC2 : struttura contenente la descrizione del rasterizzatore, notando la classe helper CD3D12_RASTERIZER_DESC2 per la creazione di descrizioni di rasterizzatori.
- 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 dall'hardware.
- ID3D11Device::CheckFeatureSupport : metodo per accedere alle funzionalità supportate.