我有一个 HLSL 着色器,它定义了一些资源,比如一个常量缓冲区:
cbuffer MyCB : register(b0);
如果我编译我的着色器,我将能够通过反射 API 查询寄存器。但是是否有可能以类似的方式在编译的着色器 blob 中更改寄存器(例如,更改为),您可以将绑定点分配给已编译的 OpenGL 程序中的资源?b3
我有一个 HLSL 着色器,它定义了一些资源,比如一个常量缓冲区:
cbuffer MyCB : register(b0);
如果我编译我的着色器,我将能够通过反射 API 查询寄存器。但是是否有可能以类似的方式在编译的着色器 blob 中更改寄存器(例如,更改为),您可以将绑定点分配给已编译的 OpenGL 程序中的资源?b3
在编译的着色器中,没有 API 可以在运行时更改着色器绑定。
如果您经历了很多困难,您也许可以通过 Shader Model 5.0 中的动态着色器链接来实现这一点,尽管这将是很多工作而且并不值得,当有一个非常简单的替代方案时 - 只需创建一个新的编译着色器与您想要的绑定。
您可以在direct3d12中通过在结构中指定一个BaseShaderRegister
非零或使用不同RegisterSpace
的值来完成此操作D3D12_DESCRIPTOR_RANGE
。如果代码更改不可行,您可以通过设置根参数的ShaderVisibility
属性隐式隔离每组寄存器。例如,这将VS
b0
与PS
b0
. 有关更多详细信息,您可以查看有关该主题的开发者视频。
唯一遇到麻烦的情况是,如果您实际上已将两个资源显式绑定到同一个插槽和寄存器空间(通过使用着色器模型 5.1 语法显式指定它)。在这种情况下,您应该了解在 D3D12 中,寄存器是跨阶段共享的,由您来确保没有冲突。
在D3D11中,这个问题不会发生,因为每个阶段都有自己的寄存器空间(VS
b0
不一样PS
b0
),即使你想共享也无法共享。尽管如此,如果您出于某种原因有一个硬编码的组件来附加数据,VS
b0
但您的顶点着色器已经编译为期望它b1
,那么您无能为力。