Nuovi tipi di risorse

Sono stati aggiunti diversi nuovi tipi di risorse in Direct3D 11.

Buffer e trame di lettura/scrittura

Le risorse del modello shader 4 sono di sola lettura. Il modello shader 5 implementa un nuovo set corrispondente di risorse di lettura/scrittura:

Queste risorse richiedono una variabile di risorsa per accedere alla memoria (tramite l'indicizzazione) perché non sono disponibili metodi per accedere direttamente alla memoria. Una variabile di risorsa può essere usata sui lati sinistro e destro di un'equazione; se usato sul lato destro, il tipo di modello deve essere un singolo componente (float, int o uint).

Buffer strutturato

Un buffer strutturato è un buffer che contiene elementi di dimensioni uguali. Utilizzare una struttura con uno o più tipi di membri per definire un elemento. Ecco una struttura con tre membri.

struct MyStruct
{
    float4 Color;
    float4 Normal;
    bool isAwesome;
};

Usare questa struttura per dichiarare un buffer strutturato come segue:

StructuredBuffer<MyStruct> mySB;

Oltre all'indicizzazione, un buffer strutturato supporta l'accesso a un singolo membro come segue:

float4 myColor = mySb[27].Color;

Usare i tipi di oggetto seguenti per accedere a un buffer strutturato:

Le funzioni atomiche che implementano operazioni interlock sono consentite per gli elementi int e uint in un RWStructuredBuffer.

Buffer di indirizzi byte

Un buffer di indirizzi byte è un buffer il cui contenuto è indirizzabile da un offset di byte. In genere, il contenuto di un buffer viene indicizzato per elemento usando uno stride per ogni elemento (S) e il numero di elemento (N) come specificato da S*N. Un buffer di indirizzi byte, che può anche essere chiamato buffer non elaborato, usa un offset di valore di byte dall'inizio del buffer per accedere ai dati. Il valore di byte deve essere un multiplo di quattro in modo che sia allineato AWORD. Se viene specificato un altro valore, il comportamento non è definito.

Il modello shader 5 introduce gli oggetti per l'accesso a un buffer di indirizzi di byte di sola lettura e a un buffer di indirizzi byte di lettura-scrittura. Il contenuto di un buffer di indirizzi byte è progettato per essere un intero senza segno a 32 bit; se il valore nel buffer non è effettivamente un intero senza segno, usare una funzione come asfloat per leggerla.

Buffer o trama di accesso non ordinato

Una risorsa di accesso non ordinata (che include buffer, trame e matrici di trame, senza multicampionamento), consente l'accesso in lettura/scrittura non ordinato temporale da più thread. Ciò significa che questo tipo di risorsa può essere letto/scritto simultaneamente da più thread senza generare conflitti di memoria tramite l'uso di Funzioni atomiche.

Creare un buffer di accesso non ordinato o una trama chiamando una funzione come ID3D11Device::CreateBuffer o ID3D11Device::CreateTexture2D e passando il flag D3D11_BIND_UNORDERED_ACCESS dall'enumerazione D3D11_BIND_FLAG .

Le risorse di accesso non ordinato possono essere associate solo ai pixel shader e agli shader di calcolo. Durante l'esecuzione, i pixel shader o gli shader di calcolo in esecuzione in parallelo hanno le stesse risorse di accesso non ordinate associate.

Accodare e utilizzare buffer

Un buffer di accodamento e utilizzo è un tipo speciale di una risorsa non ordinata che supporta l'aggiunta e la rimozione di valori dalla fine di un buffer simile al funzionamento di uno stack.

Un buffer di accodamento e utilizzo deve essere un buffer strutturato:

Usare queste risorse tramite i relativi metodi, queste risorse non usano variabili di risorsa.

Panoramica di Compute Shader