Neue Ressourcentypen
In Direct3D 11 wurden mehrere neue Ressourcentypen hinzugefügt.
- Lese-/Schreibpuffer und Texturen
- strukturierte Puffer-
- Byteadresspuffer-
- ungeordneten Zugriffspuffer oder Textur-
- Verwandte Themen
Lese-/Schreibpuffer und Texturen
Shadermodell 4-Ressourcen sind schreibgeschützt. Shadermodell 5 implementiert einen neuen entsprechenden Satz von Lese-/Schreibressourcen:
Diese Ressourcen erfordern eine Ressourcenvariable für den Zugriff auf den Arbeitsspeicher (durch Indizierung), 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 mindestens einem Elementtyp, um ein Element zu definieren. Hier ist eine Struktur mit drei Elementen.
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:
- StructuredBuffer- ist ein schreibgeschützter strukturierter Puffer.
- RWStructuredBuffer ist ein lese-/schreibgeschützter strukturierter Puffer.
Atomfunktionen, die verriegelte Vorgänge implementieren, in einem RWStructuredBufferfür int- und uint-Elemente zulässig sind.
Byte-Adresspuffer
Ein Byteadresspuffer ist ein Puffer, dessen Inhalt durch einen Byte-Offset adressierbar ist. Normalerweise werden die Inhalte eines Puffers pro Element mithilfe einer Stride für jedes Element (S) und die Elementnummer (N) gemäß S*N indiziert. Ein Byteadresspuffer, der auch als unformatierter Puffer bezeichnet werden kann, verwendet einen Bytewertoffset vom Anfang des Puffers, um auf Daten zuzugreifen. Der Bytewert muss ein Vielfaches von vier sein, sodass er DWORD ausgerichtet ist. Wenn ein anderer Wert angegeben wird, wird das Verhalten nicht definiert.
Shadermodell 5 führt Objekte für den Zugriff auf einen schreibgeschützten Byteadresspuffer sowie einen Lese-/Schreib-Byte-Adresspufferein. Der Inhalt eines Byteadresspuffers ist so konzipiert, dass es sich um eine 32-Bit-ganzzahl ohne Vorzeichen handelt; 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 (einschließlich Puffern, Texturen und Texturarrays – ohne Multisampling) ermöglicht zeitlich ungeordneten Lese-/Schreibzugriff von mehreren Threads. Dies bedeutet, dass dieser Ressourcentyp von mehreren Threads gleichzeitig gelesen/geschrieben werden kann, ohne Speicherkonflikte durch die Verwendung von Atomfunktionenzu generieren.
Erstellen Sie einen ungeordneten Zugriffspuffer oder eine Struktur, 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.
Nicht angeordnete Zugriffsressourcen können nur an Pixelshader und Compute-Shader gebunden werden. Bei der Ausführung weisen Pixel-Shader oder Compute-Shader, die parallel ausgeführt werden, die gleichen ungeordneten Zugriffsressourcen gebunden sind.
Anfügen und Verwenden des Puffers
Ein Anfüge- und Nutzungspuffer ist ein spezieller Typ einer ungeordneten Ressource, die das Hinzufügen und Entfernen von Werten am Ende eines Puffers unterstützt, ähnlich wie ein Stapel funktioniert.
Ein Anfüge- und Nutzungspuffer muss ein strukturierter Puffer sein:
Verwenden Sie diese Ressourcen über ihre Methoden, diese Ressourcen verwenden keine Ressourcenvariablen.
Verwandte Themen
-
übersicht über Computeshader