在不指定寄存器的情况下使用 cbuffer

Using cbuffer without specifying a register

我通常使用 cbuffer 并在 hlsl 中指定 'b#' 寄存器,但我最近发现在某些情况下我不必指定它很好。所以它给我带来了一个问题。

到底有什么区别
cbuffer
{
   float4x4 someMatrix = (float4x4)0;
}

cbuffer : register(b0)
{
   float4x4 someMatrix = (float4x4)0;
}

编译时是否自动绑定到b0寄存器?

编译器将未指定的缓冲区分配给 'first-fits' 策略中的寄存器。您必须在运行时使用着色器反射来确定它的确切绑定位置。参见 D3DReflect and ID3D11ShaderReflection / ID3D12ShaderReflection

You would probably use cbuffer MyCB and then use the GetConstantBufferByName method to find it rather than the unnamed cbuffer for reflection.

这是用于旧版 Effects 系统的 HLSL 的一项功能。

对于现代用法,您通常会显式分配绑定,这样就可以避免每次更改着色器时都切换绑定。