[英]Can I change binding points in a compiled D3D shader?
我有一個HLSL着色器,它定義了一些資源,比如一個常量緩沖區:
cbuffer MyCB : register(b0);
如果我編譯着色器,我將能夠通過反射API查詢寄存器。 但是,是否可以以類似的方式更改已編譯的着色器blob中的寄存器(例如, 更改為b3
),您可以將綁定點分配給已編譯的OpenGL程序中的資源?
在編譯的着色器中,沒有API可以在運行時更改着色器綁定。
如果你跳過了許多箍,你可以用Shader Model 5.0中的動態着色器鏈接實現這一點,雖然它有很多工作而且不值得,當有一個非常簡單的選擇 - 只需創建一個新的編譯着色器與你想要的綁定。
您可以在direct3d12中通過在D3D12_DESCRIPTOR_RANGE
結構中指定除零之外的BaseShaderRegister
或使用不同的RegisterSpace
值來完成此操作。 如果代碼更改不可行,則可以通過設置root參數的ShaderVisibility
屬性來隱式隔離每組寄存器。 這將隔離,例如, VS
b0
從PS
b0
。 有關更多詳細信息,您可以查看有關該主題的開發人員視頻 。
您遇到麻煩的唯一一次是,您實際上是將兩個資源顯式綁定到同一個插槽並注冊空間(通過使用着色器模型5.1語法顯式指定它)。 在這種情況下,您需要了解在D3D12中,寄存器是跨階段共享的,並且由您決定是否沒有沖突。
在D3D11中,不會發生此問題,因為每個階段都有自己的寄存器空間( VS
b0
與PS
b0
),即使您想要也無法共享。 盡管如此,如果由於某種原因你有一個硬編碼的組件將數據附加到VS
b0
但你的頂點着色器已經被編譯為期望它在b1
,你可以做的並不多。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.