3

我有一个 HLSL 着色器,它定义了一些资源,比如一个常量缓冲区:

cbuffer MyCB : register(b0);

如果我编译我的着色器,我将能够通过反射 API 查询寄存器。但是是否有可能以类似的方式在编译的着色器 blob 中更改寄存器(例如,更改为),您可以将绑定点分配给已编译的 OpenGL 程序中的资源?b3

4

2 回答 2

3

在编译的着色器中,没有 API 可以在运行时更改着色器绑定。

如果您经历了很多困难,您也许可以通过 Shader Model 5.0 中的动态着色器链接来实现这一点,尽管这将是很多工作而且并不值得,当有一个非常简单的替代方案时 - 只需创建一个新的编译着色器与您想要的绑定。

于 2016-04-27T00:13:06.970 回答
1

您可以在中通过在结构中指定一个BaseShaderRegister非零或使用不同RegisterSpace的值来完成此操作D3D12_DESCRIPTOR_RANGE。如果代码更改不可行,您可以通过设置根参数的ShaderVisibility属性隐式隔离每组寄存器。例如,这将VS b0PS b0. 有关更多详细信息,您可以查看有关该主题的开发者视频。

唯一遇到麻烦的情况是,如果您实际上已将两个资源显式绑定到同一个插槽和寄存器空间(通过使用着色器模型 5.1 语法显式指定它)。在这种情况下,您应该了解在 D3D12 中,寄存器是跨阶段共享的,由您来确保没有冲突。

在D3D11中,这个问题不会发生,因为每个阶段都有自己的寄存器空间(VS b0不一样PS b0),即使你想共享也无法共享。尽管如此,如果您出于某种原因有一个硬编码的组件来附加数据,VS b0但您的顶点着色器已经编译为期望它b1,那么您无能为力。

于 2016-04-30T03:13:43.010 回答