簡體   English   中英

我可以在已編譯的D3D着色器中更改綁定點嗎?

[英]Can I change binding points in a compiled D3D shader?

我有一個HLSL着色器,它定義了一些資源,比如一個常量緩沖區:

cbuffer MyCB : register(b0);

如果我編譯着色器,我將能夠通過反射API查詢寄存器。 但是,是否可以以類似的方式更改已編譯的着色器blob中的寄存器(例如, 更改b3 ),您可以將綁定點分配給已編譯的OpenGL程序中的資源?

在編譯的着色器中,沒有API可以在運行時更改着色器綁定。

如果你跳過了許多箍,你可以用Shader Model 5.0中的動態着色器鏈接實現這一點,雖然它有很多工作而且不值得,當有一個非常簡單的選擇 - 只需創建一個新的編譯着色器與你想要的綁定。

您可以在通過在D3D12_DESCRIPTOR_RANGE結構中指定除零之外的BaseShaderRegister或使用不同的RegisterSpace值來完成此操作。 如果代碼更改不可行,則可以通過設置root參數的ShaderVisibility屬性來隱式隔離每組寄存器。 這將隔離,例如, VS b0PS b0 有關更多詳細信息,您可以查看有關該主題的開發人員視頻

您遇到麻煩的唯一一次是,您實際上是將兩個資源顯式綁定到同一個插槽並注冊空間(通過使用着色器模型5.1語法顯式指定它)。 在這種情況下,您需要了解在D3D12中,寄存器是跨階段共享的,並且由您決定是否沒有沖突。

在D3D11中,不會發生此問題,因為每個階段都有自己的寄存器空間( VS b0PS b0 ),即使您想要也無法共享。 盡管如此,如果由於某種原因你有一個硬編碼的組件將數據附加到VS b0但你的頂點着色器已經被編譯為期望它在b1 ,你可以做的並不多。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM