在不指定寄存器的情况下使用 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 的一项功能。
对于现代用法,您通常会显式分配绑定,这样就可以避免每次更改着色器时都切换绑定。
我通常使用 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 theGetConstantBufferByName
method to find it rather than the unnamed cbuffer for reflection.
这是用于旧版 Effects 系统的 HLSL 的一项功能。
对于现代用法,您通常会显式分配绑定,这样就可以避免每次更改着色器时都切换绑定。