Beispiel für Stammsignaturen
Der folgende Abschnitt zeigt Stammsignaturen, die von leer bis vollständig vollständig komplex sind.
- Eine leere Stammsignatur
- Eine Konstante
- Hinzufügen einer Stammkonstantenpufferansicht
- Bindungsbeschreibungstabellen
- Eine komplexere Stammsignatur
- Streaming-Shaderressourcenansichten
- Verwandte Themen
Leere Stammsignatur
Eine leere Stammsignatur ist unwahrscheinlich, kann aber in einem trivialen Renderingdurchlauf mit nur dem Eingabeassembler und minimalen Vertex- und Pixel-Shadern verwendet werden, die nicht auf Deskriptoren zugreifen. Auch die Blend-Phase, renderziel- und tiefenschablonenstufen sind verfügbar, auch mit einer leeren Stammsignatur.
Eine Konstante
Der API-Bindungsplatz ist der Ort, an dem das Stammargument für diesen Parameter zur Datensatzzeit der Befehlsliste gebunden wird. Die Anzahl der API-Bindungsplätze ist implizit, basierend auf der Reihenfolge der Parameter in der Stammsignatur (die erste ist immer Null). Der HLSL-Bindungsplatz ist der Ort, an dem der Shader den Stammparameter angezeigt. Der Typ ("uint" im obigen Beispiel) ist der Hardware nicht bekannt, sondern nur ein Kommentar im Bild, die Hardware sieht einfach das einzelne DWORD als Inhalt.
Um eine Konstante zur Datensatzzeit der Befehlsliste zu binden, wird ein Befehl wie folgt verwendet:
pCmdList->SetComputeRoot32BitConstant(0,seed); // 0 is the parameter index, seed is used by the shaders
Hinzufügen einer Stammkonstantenpufferansicht
eine Konstantenpufferansicht hinzu.
Dieses Beispiel zeigt zwei Stammkonstanten und eine CBV-Stammpufferansicht (Root Constant Buffer View), die zwei DWORD-Steckplätze kostet.
Verwenden Sie zum Binden einer Konstantenpufferansicht einen Befehl wie den folgenden. Beachten Sie, dass der erste Parameter (2) der in der Abbildung angezeigte Steckplatz ist. In der Regel wird ein Array von Konstanten eingerichtet und dann den Shadern bei b0 als CBV zur Verfügung gestellt.
pCmdList->SetGraphicsRootConstantBufferView(2,GPUVAForCurrDynamicConstants);
Bindungsdeskriptortabellen
der Stammsignatur Deskriptortabellen hinzu.
Dieses Beispiel zeigt die Verwendung von zwei Deskriptortabellen; eine Tabelle mit fünf Deskriptoren deklarieren, die zur Ausführungszeit in einem CBV_SRV_UAV Deskriptor heap verfügbar sein werden, und eine andere deklarieren eine Tabelle mit zwei Deskriptoren, die zur Ausführungszeit in einem Samplerdeskriptor heap angezeigt werden.
So binden Sie Deskriptortabellen beim Aufzeichnen einer Befehlsliste.
pCmdList->SetComputeRootDescriptorTable(1, handleToCurrentMaterialDataInHeap);
pCmdList->SetComputeRootDescriptorTable(2, handleToCurrentMaterialDataInSamplerHeap);
Ein weiteres Feature der Stammsignatur ist die float4-Stammkonstante, die vier DWORDS groß ist. Der folgende Befehl bindet nur die mittleren beiden DWORDS der vier.
pCmdList->SetComputeRoot32BitConstants(0,2,myFloat2Array,1); // 2 constants starting at offset 1 (middle 2 values in float4)
Eine komplexere Stammsignatur
Dieses Beispiel zeigt eine dichte Stammsignatur mit den meisten Arten von Einträgen. Zwei der Beschreibungstabellen (bei den Plätzen 3 und 6) umfassen arrays mit ungebundener Größe. Der Aufwand liegt hier auf der Anwendung, nur gültige Deskriptoren in einem Heap zu berühren. Ungebundene oder sehr große Arrays erfordern Unterstützung der Hardwareebene 2+ der Ressourcenbindung.
Es gibt zwei statische Sampler (gebunden, ohne dass Stammsignaturplätze erforderlich sind).
Bei Steckplatz 9 werden UAV u4 und UAV u5 im gleichen Deskriptortabellenoffset deklariert. Dies ist die Verwendung eines aliasierten Deskriptors, ein Deskriptor im Arbeitsspeicher wird sowohl als u4 als auch u5 in den HLSL-Shadern angezeigt. In diesem Fall muss der Shader mit der Option "D3D10_SHADER_RESOURCES_MAY_ALIAS" oder der option "or /res_may_alias
" in FXC kompiliert werden. Aliasdeskriptoren ermöglichen es einem Deskriptor, an mehrere Bindungspunkte gebunden zu werden, ohne änderungen an den Shadern vornehmen zu müssen.
Streaming-Shaderressourcenansichten
Diese Stammsignatur veranschaulicht ein Szenario, in dem alle SRVs in und aus einem großen Array gestreamt werden. Zur Ausführungszeit kann eine Deskriptortabelle einmal festgelegt werden, wenn die Stammsignatur festgelegt wird. Anschließend werden alle Texturlesevorgänge durch Indizieren in das Array über Konstanten durchgeführt, die über die ersten Stammargumente gespeist werden. Es ist nur ein einzelner Deskriptor-Heap erforderlich und wird nur aktualisiert, wenn Texturen in oder aus freien Deskriptor-Slots gestreamt werden.
Die Deskriptorversätze im großen Heap werden durch Shader mithilfe der Konstanten in den Konstantenpufferansichten identifiziert. Wenn z. B. ein Shader eine Material-ID erhält, kann er in das ein großes Array mit der Konstante für den Zugriff auf den erforderlichen Deskriptor (der auf die erforderliche Textur verweist) indiziert werden.
Dieses Szenario erfordert Hardware mit Ressourcenbindungsebene2+.
Verwandte Themen