我可以在已编译的 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 中使用 dynamic shader linking 来实现这一点,尽管这会需要大量工作而且不值得,但有一个非常简单的替代方案- 只需使用您想要的绑定创建一个新的已编译着色器。

您可以在 by specifying a BaseShaderRegister other than zero, or using different RegisterSpace values, in the D3D12_DESCRIPTOR_RANGE struct. If code changes are not feasible, you can isolate each set of registers implicitly by setting the root parameter's ShaderVisibility property. This will isolate, for example, VS b0 from PS b0. For more details, you can check out the developer video 中完成此主题。

唯一会 运行 遇到麻烦的情况是,如果您实际上已将两个资源显式绑定到同一个插槽并注册 space(通过使用着色器模型 5.1 语法显式指定它)。在这种情况下,你应该明白在D3D12中,寄存器是跨阶段共享的,你要确保没有冲突。

在D3D11中,不会出现这个问题,因为每个阶段都有自己的寄存器space(VS b0PS b0) 而你 不能 分享,即使你想分享。尽管如此,如果您出于某种原因硬编码了一个组件以将数据附加到 VS b0 但您的顶点着色器已经编译为期望它在 b1,那么您可以做的不多做。