Condividi tramite


Funzioni di campionamento delle texture delle risorse suddivise in piastrelle

Questa sezione descrive le funzionalità di campionamento delle texture delle risorse affiancate.

Requisiti delle funzionalità di campionamento delle texture delle risorse a mosaico

Le funzionalità di campionamento delle texture descritte qui richiedono Tier 2 livello di supporto delle risorse affiancate.

Feedback dello shader sulle aree mappate

Qualsiasi istruzione shader che legge e/o scrive in una risorsa affiancata comporta 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. Ma è 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 mappato 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 cadono direttamente su un centro di texel: altri 3 texel (che possono variare in base all'hardware) contribuiscono al filtro sebbene con peso zero. Questi i texel di peso 0 non contribuiscono affatto al risultato del filtro, quindi se cadono su riquadri NULL, non contano come un 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 vengono 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 in NULL, viene segnalato un NULL mappato accesso, indipendentemente dai componenti effettivamente considerati nel risultato. Ad esempio, la lettura da R8_UNORM e il mascheramento del risultato della lettura nello shader con .gba/.yzw non sembrerebbe richiedere affatto la lettura della texture. Tuttavia, se l'indirizzo del texel è una tile NULL mappata, l'operazione viene comunque conteggiata come un accesso alla mappa NULL .

Lo shader può controllare lo stato e perseguire qualsiasi azione desiderata in caso di fallimento. Ad esempio, una strategia può essere la registrazione di "mancati obiettivi" (ad esempio tramite scrittura UAV) e/o effettuare un'altra lettura limitata a un LOD più grossolano noto per essere mappato. Un'applicazione potrebbe voler tenere traccia degli accessi riusciti e per avere un'idea della parte del set mappato di riquadri a cui è stato eseguito l'accesso.

Una complicazione nella registrazione è che non esiste un meccanismo per segnalare il set esatto di riquadri a cui si sarebbe avuto 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 avesse la possibilità di evitare di segnalare gli accessi ai riquadri se fossero già stati segnalati altrove in precedenza. Forse lo stato di tale tracciamento potrebbe essere reimpostato dall'API (probabilmente ai bordi dei fotogrammi).

Limitatore MinLOD per campione

Per aiutare gli shader a evitare aree note come non mappate nelle risorse mipmapped affiancate, la maggior parte delle istruzioni dello shader che implicano l'uso di un campionatore (filtro) ha una nuova modalità che consente allo shader di passare un parametro di blocco MinLOD float32 aggiuntivo al campione di texture. Questo valore si trova nello spazio del numero mipmap della visualizzazione, anziché nella risorsa sottostante.

L'hardware esegue max(fShaderMinLODClamp,fComputedLOD) nello stesso punto del calcolo LOD in cui avviene la limitazione MinLOD specifica 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 fuori limite come il blocco minLOD per risorsa: 0 per i componenti nel formato 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 limitato restituito da questa istruzione LOD riflette tutte le limitazioni, incluso il limite per risorsa, ma non un limite per campione. Il blocco per campione è controllato e noto comunque dallo shader, in modo che l'autore dello shader possa applicare manualmente tale blocco al valore restituito dell'istruzione LOD, se necessario.

Filtro di riduzione min/max

Le applicazioni possono scegliere di gestire le proprie strutture di dati che le informano delle modalità di mapping per una risorsa piastrellata. Un esempio sarebbe una superficie che include un texel per detenere informazioni su ogni riquadro in una risorsa affiancata. È possibile archiviare il primo LOD mappato in una determinata posizione del riquadro. Eseguendo un attento campionamento di questa struttura di dati in modo analogo alla risorsa suddivisa in riquadri che deve essere campionata, si potrebbe scoprire quale sarà il livello di dettaglio (LOD) minimo completamente mappato per un'intera estensione del filtro di texture. Per semplificare questo processo, Direct3D 11.2 introduce una nuova modalità di campionatore 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à dei campionatori che recupera lo stesso set di texel che un normale filtro di texture recupererebbe. Ma invece di combinare i valori per produrre una risposta, restituisce i valori min() o max() dei texel recuperati, in base al componente (ad esempio, il min 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 texture che si trovano direttamente su un centro texel - altri 3 texel (che possono variare in base all'hardware) contribuiscono al filtro ma con peso pari a 0. Per qualsiasi di questi texel con peso 0 su un filtro non min/max, se il filtro è di tipo min/max, questi texel ancora non contribuiscono al risultato (e i pesi non influenzano altrimenti l'operazione del 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 Tier 2 per le risorse tiled.

Accesso della pipeline alle risorse affiancate