Condividi tramite


Funzionalità di campionamento delle trame delle risorse di streaming

Le funzionalità di campionamento delle texture delle risorse di streaming includono la possibilità di ottenere un feedback sullo stato dello shader in merito alle aree mappate, di verificare se tutti i dati a cui si accede sono stati mappati nella risorsa, di effettuare il bloccaggio per aiutare gli shader a evitare le aree nelle risorse di streaming sottoposte a mipmap che sono note per essere non mappate e di scoprire quale sarà il LOD minimo completamente mappato per un'intera impronta del filtro texture.

Requisiti delle funzionalità di campionamento delle texture delle risorse di streaming

Le funzionalità di campionamento delle texture descritte di seguito richiedono il Livello 2 di supporto delle risorse di streaming.

Feedback sullo stato dello shader sulle aree mappate

Qualsiasi istruzione shader che legge e/o scrive in una risorsa di streaming determina la registrazione delle informazioni sullo stato. Questo stato viene esposto come valore restituito extra facoltativo per ogni istruzione di accesso alle risorse, che viene inserita in un registro temporaneo a 32 bit. I contenuti del valore restituito sono opachi. In altre parole, 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 mappato nella risorsa. CheckAccessFullyMapped restituisce Vero (0xFFFFFFFF) se i dati sono stati mappati o Falso (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 texture che cadono direttamente su un centro di texel: 3 altri texel (che possono variare in base all'hardware) contribuiscono al filtro ma con peso 0. Questi texel di peso 0 non contribuiscono affatto al risultato del filtro, quindi se si verificano dei riquadri con valore NULL , non vengono considerati come accesso non mappato. Si noti che la stessa garanzia si applica per i filtri di texture che includono più livelli mip; se i texel in uno dei mipmap non vengono mappati, ma il peso su tali texel è 0, tali 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 affatto la texture. Tuttavia, se l'indirizzo del texel è un riquadro mappato dal valore NULL , l'operazione viene comunque conteggiata come accesso alla mappa NULL .

Lo shader può controllare lo stato e perseguire qualsiasi azione desiderata in caso di errore. Ad esempio, un corso di azione può essere la registrazione di "perdite" (ad esempio tramite scrittura UAV) e/o l'emissione di un'altra lettura bloccata a un LOD più grossolano noto per essere mappato. Un'applicazione potrebbe voler tenere traccia anche degli accessi riusciti, per capire quale porzione dell'insieme di riquadri mappati è stata raggiunta.

Una complicazione per l'accesso è che non esiste alcun meccanismo per riportare l'esatto set di tessere a cui si ha avuto accesso. L'applicazione può fare ipotesi conservatrici in base alla conoscenza delle coordinate usate per l'accesso, nonché l'uso dell'istruzione LOD; ad esempio, tex2Dlod) 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 potrebbe essere in grado di non disturbare l'accesso ai riquadri se sono stati segnalati altrove in precedenza. Forse lo stato di tale rilevamento potrebbe essere reimpostato dall'API (probabilmente in corrispondenza dei limiti dei fotogrammi).

Blocco MinLOD per campione

Per aiutare gli shader a evitare le aree delle risorse di streaming sottoposte a mipmap, che sono note per essere non mappate, la maggior parte delle istruzioni shader che prevedono l'uso di un campionatore (filtraggio) hanno una modalità che consente allo shader di passare un parametro aggiuntivo blocco MinLOD float32 al campione della texture. Tale valore si trova nello spazio del numero mipmap della visualizzazione, anziché nella risorsa sottostante.

L'hardware viene eseguitomax(fShaderMinLODClamp,fComputedLOD)nella stessa posizione nel calcolo LOD in cui si verifica il blocco MinLOD per risorsa, che è anche un valore 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 per l'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 qui descritto, 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 è 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 li informano dell'aspetto dei mapping per una risorsa di streaming. Un esempio è una superficie che contiene un texel per mantenere informazioni per ogni riquadro in una risorsa di streaming. È possibile archiviare il primo LOD mappato in una determinata posizione del riquadro. Con un accurato campionamento di questa struttura dati in modo analogo alla risorsa di streaming che deve essere campionata, si potrebbe scoprire quale sarà il LOD minimo di cui è stato eseguito il mapping completo per un intero footprint del filtro di texture. Per semplificare questo processo, Direct3D 11.2 introduce una nuova modalità di campionatore per utilizzo generico, ovvero, filtraggio 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 filtraggio di riduzione min/max è una modalità nei campionatori che recupera lo stesso set di texel recuperati da un normale filtro di texture. Tuttavia, anziché 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 cadono direttamente su un centro di texel: in quel caso, altri 3 texel (che possono variare in base all'hardware) contribuiscono al filtro ma con peso 0. Per uno di questi texel che sarebbero di peso 0 su un filtro non min/max, se il filtro è min/max, questi texel ancora non contribuiscono al risultato (e i pesi non influiscono altrimenti sull'operazione di filtro min/max).

Il supporto per questa funzionalità dipende dal supporto del Livello 2 per le risorse di streaming.

Accesso della pipeline alle risorse di streaming