Beispiele für Stammsignaturen
Der folgende Abschnitt zeigt Stammsignaturen, die in der Komplexität von leer bis vollständig vollständig variieren.
- Eine leere Stammsignatur
- Eine Konstante
- Hinzufügen einer Stammkonstantenpufferansicht
- Bindungsdeskriptortabellen
- Eine komplexere Stammsignatur
- Streaming-Shaderressourcenansichten
- Zugehörige Themen
Eine leere Stammsignatur
Eine leere Stammsignatur ist unwahrscheinlich nützlich, kann aber in einem trivialen Renderingdurchlauf verwendet werden, wobei nur der Eingabeassemler und minimale Vertex- und Pixel-Shader verwendet werden, die nicht auf Deskriptoren zugreifen. Auch die Blendphase, das Renderziel und die Tiefenschablonenstufen sind verfügbar, auch mit einer leeren Stammsignatur.
Eine Konstante
Im API-Bindungsslot wird das Stammargument für diesen Parameter zur Zeitpunkt des Befehlslistendatensatzes gebunden. Die Anzahl der API-Bindungsslots ist implizit, basierend auf der Reihenfolge der Parameter in der Stammsignatur (der erste ist immer 0). Im HLSL-Bindungsslot wird für den Shader der Stammparameter angezeigt. Der Typ ("uint" im obigen Beispiel) ist der Hardware nicht bekannt, ist aber nur ein Kommentar im Image, die Hardware sieht einfach den einzelnen DWORD als Inhalt.
Um eine Konstante zur Zeitpunkt des Befehlslisteneintrags zu binden, wird ein Befehl ähnlich dem folgenden verwendet:
pCmdList->SetComputeRoot32BitConstant(0,seed); // 0 is the parameter index, seed is used by the shaders
Hinzufügen einer Stammkonstantenpufferansicht
Dieses Beispiel zeigt zwei Stammkonstanten und eine Stammkonstantenpuffersicht (CBV), die zwei DWORD-Slots kostet.
Verwenden Sie einen Befehl wie den folgenden, um eine Konstantenpuffersicht zu binden. Beachten Sie, dass der erste Parameter (2) der in der Abbildung dargestellte Slot ist. In der Regel wird ein Array von Konstanten eingerichtet und den Shadern unter b0 als CBV zur Verfügung gestellt.
pCmdList->SetGraphicsRootConstantBufferView(2,GPUVAForCurrDynamicConstants);
Bindungsdeskriptortabellen
Dieses Beispiel zeigt die Verwendung von zwei Deskriptortabellen; eine, die eine Tabelle mit fünf Deskriptoren deklariert, die zur Ausführungszeit in einem CBV_SRV_UAV Deskriptorheap verfügbar sind, und eine andere, die eine Tabelle mit zwei Deskriptoren deklariert, die zur Ausführungszeit in einem Samplerdeskriptorheap 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 Deskriptortabellen (an den Slots 3 und 6) enthalten Arrays mit unbegrenzter Größe. Die Last liegt hier auf der Anwendung, nur gültige Deskriptoren in einem Heap zu berühren. Für ungebundene oder sehr große Arrays ist die Unterstützung der Ressourcenbindung auf Hardwareebene 2+ erforderlich.
Es gibt zwei statische Sampler (gebunden ohne Stammsignaturslots).
Im Slot 9 werden UAV u4 und UAV u5 mit demselben Deskriptortabellenoffset deklariert. Hierbei wird ein Aliasdeskriptor verwendet. Ein Deskriptor im Arbeitsspeicher wird sowohl als u4 als auch als u5 in den HLSL-Shadern angezeigt. In diesem Fall muss der Shader mit der Option D3D10_SHADER_RESOURCES_MAY_ALIAS oder der Option oder /res_may_alias
in FXC kompiliert werden. Aliasdeskriptoren ermöglichen es, dass ein Deskriptor an mehrere Bindungspunkte gebunden wird, 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 Indizierung in das Array über Konstanten ausgeführt, die über die ersten Stammargumente eingespeist werden. Es ist nur ein einzelner Deskriptorheap erforderlich und wird nur aktualisiert, wenn Texturen in oder aus freien Deskriptorslots gestreamt werden.
Die Deskriptoroffsets im großen Heap werden durch Shader mit den Konstanten in den Konstantenpuffersichten identifiziert. Wenn einem Shader beispielsweise eine Material-ID zugewiesen wird, kann er mithilfe der Konstanten in das eine große Array indiziert werden, um auf den erforderlichen Deskriptor zuzugreifen (der auf die erforderliche Textur verweist).
Für dieses Szenario ist Hardware mit Ressourcenbindungsebene2+ erforderlich.
Zugehörige Themen