Neue Ressourcentypen

In Direct3D 11 wurden mehrere neue Ressourcentypen hinzugefügt.

Lese-/Schreibpuffer und Texturen

Shadermodell 4-Ressourcen sind schreibgeschützte Ressourcen. Shadermodell 5 implementiert einen neuen entsprechenden Satz von Lese-/Schreibressourcen:

Für diese Ressourcen ist eine Ressourcenvariable erforderlich, um auf den Arbeitsspeicher (über indizieren) zuzugreifen, da es keine Methoden für den direkten Zugriff auf den Arbeitsspeicher gibt. Eine Ressourcenvariable kann auf der linken und rechten Seite einer Formel verwendet werden. bei Verwendung auf der rechten Seite muss der Vorlagentyp eine einzelne Komponente (float, int oder uint) sein.

Strukturierter Puffer

Ein strukturierter Puffer ist ein Puffer, der Elemente gleicher Größe enthält. Verwenden Sie eine -Struktur mit einem oder mehreren Membertypen, um ein Element zu definieren. Hier sehen Sie eine Struktur mit drei Membern.

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

Verwenden Sie diese Struktur, um einen strukturierten Puffer wie folgt zu deklarieren:

StructuredBuffer<MyStruct> mySB;

Zusätzlich zur Indizierung unterstützt ein strukturierter Puffer den Zugriff auf ein einzelnes Element wie folgt:

float4 myColor = mySb[27].Color;

Verwenden Sie die folgenden Objekttypen, um auf einen strukturierten Puffer zuzugreifen:

Atomic-Funktionen , die verzahnte Vorgänge implementieren, sind für int- und uint-Elemente in einem RWStructuredBuffer zulässig.

Byteadresspuffer

Ein Byteadresspuffer ist ein Puffer, dessen Inhalt durch einen Byteoffset adressierbar ist. Normalerweise werden die Inhalte eines Puffers pro Element mit einem Stride für jedes Element (S) und der Elementnummer (N) gemäß S*N indiziert. Ein Byteadresspuffer, der auch als Rohpuffer bezeichnet werden kann, verwendet einen Bytewertoffset vom Anfang des Puffers, um auf Daten zuzugreifen. Der Bytewert muss ein Vielfaches von vier sein, damit er DWORD ausgerichtet ist. Wenn ein anderer Wert angegeben wird, ist das Verhalten nicht definiert.

Das Shadermodell 5 führt Objekte für den Zugriff auf einen schreibgeschützten Byteadresspuffer sowie einen Byteadresspuffer mit Lese-/Schreibzugriff ein. Der Inhalt eines Byteadresspuffers ist so konzipiert, dass er eine 32-Bit-Ganzzahl ohne Vorzeichen ist. Wenn der Wert im Puffer nicht wirklich eine ganze Zahl ohne Vorzeichen ist, verwenden Sie eine Funktion wie asfloat , um ihn zu lesen.

Ungeordneter Zugriffspuffer oder -textur

Eine ungeordnete Zugriffsressource (die Puffer, Texturen und Texturarrays ohne Multisampling umfasst) ermöglicht zeitlich ungeordneten Lese-/Schreibzugriff aus mehreren Threads. Dies bedeutet, dass dieser Ressourcentyp gleichzeitig von mehreren Threads gelesen/geschrieben werden kann, ohne durch die Verwendung von Atomic Functions Speicherkonflikte zu erzeugen.

Erstellen Sie einen ungeordneten Zugriffspuffer oder eine ungeordnete Textur, indem Sie eine Funktion wie ID3D11Device::CreateBuffer oder ID3D11Device::CreateTexture2D aufrufen und das D3D11_BIND_UNORDERED_ACCESS-Flag aus der D3D11_BIND_FLAG-Enumeration übergeben.

Ressourcen für ungeordneten Zugriff können nur an Pixelshader und Compute-Shader gebunden werden. Während der Ausführung verfügen Pixelshader oder parallel ausgeführte Compute-Shader über die gleichen ungeordneten Zugriffsressourcen.

Anfügen und Nutzen des Puffers

Ein Anfüge- und Nutzungspuffer ist ein spezieller Typ einer ungeordneten Ressource, der das Hinzufügen und Entfernen von Werten vom Ende eines Puffers unterstützt, ähnlich wie bei einem Stapel.

Ein Anfüge- und Nutzungspuffer muss ein strukturierter Puffer sein:

Verwenden Sie diese Ressourcen über ihre Methoden. Diese Ressourcen verwenden keine Ressourcenvariablen.

Übersicht über Compute-Shader