Sie können dies durch die Angabe eines BaseShaderRegister
ungleich Null ist, oder unter Verwendung verschiedener RegisterSpace
Werte in der D3D12_DESCRIPTOR_RANGE
Struktur in direct3d12 erreichen. Wenn Codeänderungen nicht möglich sind, können Sie jeden Satz von Registern implizit isolieren, indem Sie die Eigenschaft ShaderVisibility
des Root-Parameters festlegen. Dies isoliert zum Beispiel VS
b0
von PS
b0
. Weitere Informationen finden Sie unter developer video zum Thema.
Das einzige Mal, dass Sie Probleme bekommen, ist, wenn Sie tatsächlich zwei Ressourcen explizit an denselben Slot gebunden haben und Speicherplatz registrieren (indem Sie ihn explizit mit der Syntax des Shadermodells 5.1 angeben). In diesem Fall wird von Ihnen erwartet, dass Sie wissen, dass Register in D3D12 über Kreuz geteilt werden, und es liegt an Ihnen, sicherzustellen, dass Sie keine Kollisionen haben.
In D3D11, tritt dieses Problem nicht, da jede Stufe ein eigenes Register Raum (VS
b0
ist nicht das gleiche wie PS
b0
) und Sie nicht Aktien selbst wenn man wollte. Dennoch, wenn Sie aus irgendeinem Grund eine Komponente hart-codiert haben, um Daten an VS
b0
anzuhängen, aber Ihr Vertex-Shader wurde bereits kompiliert, um es bei b1
zu erwarten, können Sie nicht viel tun.
Sie können auch die [shader linking] (https://msdn.microsoft.com/en-us/library/windows/desktop/dn466359.aspx) Technologie betrachten - eine Direct3D 11, die der alten entspricht "FWLINK" -Technik –
@MuertoExcobito Ich möchte die Bindungen zur Laufzeit ändern. Der Grund dafür ist, dass in D3D12 ein Problem auftritt, wenn Ressourcen von verschiedenen Shader-Stufen (PS und VS) demselben Register zugeordnet werden: Solche Ressourcen müssen in verschiedene Deskriptor-Tabellen eingegeben werden. Ich möchte, dass alle meine Ressourcen in einer einzigen Deskriptor-Tabelle sind und ich kann mir nur vorstellen, Bindings in kompilierten Shadern neu zuzuweisen, damit sie sich nicht überschneiden. Ich denke, dass es möglich ist, sich mit dem Bytecode zu beschäftigen (timjones.tw/blog/archive/2015/09/02/...), aber ich hatte gehofft, dass es einen offiziellen Weg gibt, dies zu tun. – Egor
Wenn ich nicht falsch verstanden habe, können Sie einfach Ihre HLSL-Shader bearbeiten und sicherstellen, dass sich die Bindungen nicht überlappen. Das direkte Bearbeiten von Bytecode ist möglich, aber mühsam und nicht unbedingt vorwärtskompatibel. – MuertoExcobito