Funzionalità di campionamento delle trame delle risorse affiancate
Questa sezione descrive le funzionalità di campionamento delle trame delle risorse affiancate.
Requisiti delle funzionalità di campionamento delle trame delle risorse affiancate
Le funzionalità di campionamento delle trame descritte qui richiedono il livello 2 di supporto delle risorse affiancate.
Feedback dello shader sulle aree mappate
Qualsiasi istruzione shader che legge e/o scrive in una risorsa affiancata determina la registrazione delle informazioni sullo stato. Questo stato viene esposto come valore restituito aggiuntivo facoltativo per ogni istruzione di accesso alle risorse che viene inserita in un registro temporaneo a 32 bit. Il contenuto del valore restituito è opaco. Ovvero, la lettura diretta dal programma shader non è consentita. È tuttavia possibile usare la funzione CheckAccessFullyMapped per estrarre le informazioni sullo stato.
Controllo con mapping completo
La funzione CheckAccessFullyMapped interpreta lo stato restituito da un accesso alla memoria e indica se tutti i dati a cui si accede è stato eseguito il mapping nella risorsa. CheckAccessFullyMapped restituisce true (0xFFFFFFFF) se i dati sono stati mappati o false (0x00000000) se i dati non sono stati mappati.
Durante le operazioni di filtro, a volte il peso di un determinato texel finisce per essere 0,0. Un esempio è un campione lineare con coordinate di trama che rientrano direttamente su un centro texel: 3 altri texel (che possono variare in base all'hardware) contribuiscono al filtro, ma con 0 peso. Questi texel di peso 0 non contribuiscono affatto al risultato del filtro, quindi se si verifica un calo nei riquadri NULL , non vengono conteggiati come accesso non mappato. Si noti che la stessa garanzia si applica per i filtri di trama che includono più livelli mip; se i texel in uno dei mipmap non sono mappati, ma il peso su tali texel è 0, questi texel non vengono conteggiati come accesso non mappato.
Quando si esegue il campionamento da un formato con meno di 4 componenti (ad esempio DXGI_FORMAT_R8_UNORM), tutti i texel che rientrano nei riquadri NULL comportano la segnalazione di un accesso mappato NULL indipendentemente dai componenti che lo shader esamina effettivamente nel risultato. Ad esempio, la lettura da R8_UNORM e la maschera del risultato di lettura nello shader con .gba/.yzw non sembra dover leggere la trama. Tuttavia, se l'indirizzo del texel è un riquadro mappato NULL , l'operazione viene comunque conteggiata come accesso alla mappa NULL .
Lo shader può controllare lo stato e perseguire qualsiasi corso di azione desiderato in caso di errore. Ad esempio, un corso di azione può registrare "mancati" (ad esempio tramite scrittura UAV) e/o emettere un'altra lettura bloccata su un LOD grossolano noto per essere mappato. Un'applicazione potrebbe voler tenere traccia degli accessi riusciti per avere un'idea della parte del set mappato di riquadri a cui è stato eseguito l'accesso.
Una complicazione per la registrazione non esiste alcun meccanismo per segnalare il set esatto di riquadri a cui sarebbe stato eseguito l'accesso. L'applicazione può eseguire ipotesi conservatrici in base alla conoscenza delle coordinate usate per l'accesso, nonché all'uso dell'istruzione LOD (ad esempio , tex2Dlod) che restituisce il calcolo loD hardware.
Un'altra complicazione è che molti accessi saranno agli stessi riquadri, quindi si verificheranno molte registrazioni ridondanti e probabilmente contese sulla memoria. Potrebbe essere utile se l'hardware può essere dato la possibilità di non disturbare l'accesso ai riquadri se sono stati segnalati altrove prima. Forse lo stato di tale rilevamento potrebbe essere reimpostato dall'API (probabilmente ai limiti dei frame).
Blocco MinLOD per campione
Per aiutare gli shader a evitare le aree nelle risorse affiancate mipmapped note come non mappate, la maggior parte delle istruzioni shader che prevedono l'uso di un campionatore (filtro) ha una nuova modalità che consente al shader di passare un parametro float32 MinLOD aggiuntivo al campione di trama. Questo valore si trova nello spazio del numero mipmap della visualizzazione, anziché nella risorsa sottostante.
L'hardware esegue max(fShaderMinLODClamp,fComputedLOD) nella stessa posizione nel calcolo LOD in cui si verifica il blocco MinLOD per risorsa, che è anche un max().
Se il risultato dell'applicazione del blocco LOD per campione e di qualsiasi altro blocco LOD definito nel campionatore è un set vuoto, il risultato è lo stesso risultato di accesso out-of-bounds del blocco minLOD per risorsa: 0 per i componenti nel formato di superficie e i valori predefiniti per i componenti mancanti.
L'istruzione LOD ,ad esempio tex2Dlod, che precede il blocco minLOD per campione descritto qui, restituisce sia un LOD bloccato che un LOD non crittografato. Il LOD bloccato restituito da questa istruzione LOD riflette tutto il blocco, incluso il blocco per risorsa, ma non un blocco per campione. Il blocco per campione viene controllato e conosciuto comunque dallo shader, quindi l'autore dello shader può applicare manualmente tale morsa al valore restituito dell'istruzione LOD, se lo si desidera.
Filtro di riduzione min/max
Le applicazioni possono scegliere di gestire le proprie strutture di dati che li informano dell'aspetto dei mapping per una risorsa affiancata. Un esempio è una superficie che contiene un texel per contenere informazioni per ogni riquadro in una risorsa affiancata. È possibile archiviare il primo LOD mappato in una determinata posizione del riquadro. Eseguendo un'attenta campionamento di questa struttura di dati in modo analogo alla risorsa affiancata da campionare, è possibile individuare il LOD minimo di cui viene eseguito il mapping completo per un intero footprint del filtro trama. Per semplificare questo processo, Direct3D 11.2 introduce una nuova modalità di campionamento per utilizzo generico, filtro min/max.
L'utilità del filtro min/max per il rilevamento LOD può essere utile per altri scopi, ad esempio, ad esempio il filtro delle superfici di profondità.
Il filtro di riduzione min/max è una modalità nei campionatori che recupera lo stesso set di texel che un normale filtro trama recupera. Ma invece di combinare i valori per produrre una risposta, restituisce il valore min() o max() dei texel recuperati, in base ai singoli componenti (ad esempio, il valore minimo di tutti i valori R, separatamente dal min di tutti i valori G e così via).
Le operazioni min/max seguono regole di precisione aritmetica Direct3D. L'ordine dei confronti non è importante.
Durante le operazioni di filtro che non sono min/max, a volte il peso di un determinato texel finisce per essere 0,0. Un esempio è un campione lineare con coordinate di trama che rientrano direttamente su un centro texel - 3 altri texel (che possono variare in base all'hardware) contribuiscono al filtro, ma con 0 peso. Per uno di questi texel che sarebbero di 0 peso su un filtro non min/max, se il filtro è min/max, questi texel non contribuiscono comunque al risultato (e i pesi non influiscono altrimenti sull'operazione di filtro min/max).
L'elenco completo delle modalità di filtro viene visualizzato nell'enumerazione D3D11_FILTER con MINIMUM e MAXIMUM nei valori di enumerazione .
Il supporto per questa funzionalità dipende dal supporto di livello 2 per le risorse affiancate.
Argomenti correlati