Neue Ressourcentypen
In Direct3D 11 wurden mehrere neue Ressourcentypen hinzugefügt.
- Lese-/Schreibpuffer und Texturen
- Strukturierter Puffer
- Byte-Adresspuffer
- Nicht angeordneter Zugriffspuffer oder Textur
- Zugehörige 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, um auf Arbeitsspeicher zuzugreifen (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; wenn sie auf der rechten Seite verwendet werden, 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 ist eine Struktur mit drei Mitgliedern.
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-/Schreibzugriffspuffer.
Atomfunktionen , die interlockierte Vorgänge implementieren, sind int- und Uint-Elementen in einem RWStructuredBuffer zulässig.
Byte-Adresspuffer
Ein Byteadressenpuffer ist ein Puffer, dessen Inhalt durch einen Byte-Offset adressierbar ist. Normalerweise werden die Inhalte eines Puffers pro Element mit einem Stride für jedes Element (S) und die Elementnummer (N) indiziert, wie von S*N angegeben. Ein Byte-Adresspuffer, der auch als roher Puffer bezeichnet werden kann, verwendet einen Bytewert-Offset vom Anfang des Puffers zum Zugriff auf Daten. Der Bytewert muss ein Vielfaches von vier sein, sodass es DWORD ausgerichtet ist. Wenn ein anderer Wert bereitgestellt wird, wird das Verhalten nicht definiert.
Shadermodell 5 führt Objekte für den Zugriff auf einen schreibgeschützten Byte-Adresspuffer sowie einen Lese-Schreib-Byte-Adresspuffer ein. Der Inhalt eines Byteadressenpuffers ist so konzipiert, dass es sich um eine 32-Bit-nicht signierte Ganze Zahl handelt; wenn der Wert im Puffer nicht wirklich eine nicht signierte ganze Zahl ist, verwenden Sie eine Funktion wie z. B. "Float ", um ihn zu lesen.
Nicht angeordneter Zugriffspuffer oder Textur
Eine ungeordnete Zugriffsressource (einschließlich Puffer, Texturen und Texturarrays – ohne Multisampling), ermöglicht zeitlich ungeordneten Lese-/Schreibzugriff von mehreren Threads. Dies bedeutet, dass dieser Ressourcentyp gleichzeitig von mehreren Threads gelesen/geschrieben werden kann, ohne dass Speicherkonflikte über die Verwendung von Atomfunktionen generiert werden.
Erstellen Sie einen nicht sortierten Zugriffspuffer oder eine 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.
Nicht angeordnete Zugriffsressourcen können nur an Pixel-Shader und Compute-Shader gebunden werden. Während der Ausführung verfügen Pixel-Shader oder Compute-Shader parallel über dieselben nicht angeordneten Zugriffsressourcen.
Anfügen und Nutzen des Puffers
Ein Anfüge- und Verbrauchpuffer 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 Verbrauchpuffer muss ein strukturierter Puffer sein:
Verwenden Sie diese Ressourcen über ihre Methoden, diese Ressourcen verwenden keine Ressourcenvariablen.
Zugehörige Themen