繁体   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