[英]Can I change binding points in a compiled D3D shader?
我有一个HLSL着色器,它定义了一些资源,比如一个常量缓冲区:
cbuffer MyCB : register(b0);
如果我编译着色器,我将能够通过反射API查询寄存器。 但是,是否可以以类似的方式更改已编译的着色器blob中的寄存器(例如, 更改为b3
),您可以将绑定点分配给已编译的OpenGL程序中的资源?
在编译的着色器中,没有API可以在运行时更改着色器绑定。
如果你跳过了许多箍,你可以用Shader Model 5.0中的动态着色器链接实现这一点,虽然它有很多工作而且不值得,当有一个非常简单的选择 - 只需创建一个新的编译着色器与你想要的绑定。
您可以在direct3d12中通过在D3D12_DESCRIPTOR_RANGE
结构中指定除零之外的BaseShaderRegister
或使用不同的RegisterSpace
值来完成此操作。 如果代码更改不可行,则可以通过设置root参数的ShaderVisibility
属性来隐式隔离每组寄存器。 这将隔离,例如, VS
b0
从PS
b0
。 有关更多详细信息,您可以查看有关该主题的开发人员视频 。
您遇到麻烦的唯一一次是,您实际上是将两个资源显式绑定到同一个插槽并注册空间(通过使用着色器模型5.1语法显式指定它)。 在这种情况下,您需要了解在D3D12中,寄存器是跨阶段共享的,并且由您决定是否没有冲突。
在D3D11中,不会发生此问题,因为每个阶段都有自己的寄存器空间( VS
b0
与PS
b0
),即使您想要也无法共享。 尽管如此,如果由于某种原因你有一个硬编码的组件将数据附加到VS
b0
但你的顶点着色器已经被编译为期望它在b1
,你可以做的并不多。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.