Algorithm DirectX11和packetoffset

Algorithm DirectX11和packetoffset,algorithm,rendering,hlsl,directx-10,directx-11,Algorithm,Rendering,Hlsl,Directx 10,Directx 11,有人知道如何在DirectX10/11中将“packetoffset”与bool类型一起使用吗?我不确定这应该如何协调 cbuffer SomeBuffer : register( b1 ) { float3 SomeFloat3: packoffset(c0); float SomeFloat: packoffset(c0.w); float3 SomeFloat32: packoffset(c1); float2 SomeFloat2; ?? bo

有人知道如何在DirectX10/11中将“packetoffset”与bool类型一起使用吗?我不确定这应该如何协调

cbuffer SomeBuffer : register( b1 )
{
    float3 SomeFloat3: packoffset(c0);
    float SomeFloat: packoffset(c0.w);

    float3 SomeFloat32: packoffset(c1);
    float2 SomeFloat2; ??

    bool SomeBool1; ??
    bool SomeBool2; ??
    bool SomeBool3; ??
}

这实际上是两个问题:

  • 如果使用一个导致变量超出单个寄存器边界的
    packoffset
    ,会发生什么情况
  • 如何将
    packoffset
    bool
    值一起使用
  • 第一个问题的答案是:HLSL编译器将对
    packoffset
    值进行一些验证。因此,以下内容将不会编译,因为
    Var2
    无法适应
    c0
    ,并且编译器不会自动将其“包装”到
    c1

    cbuffer SomeBuffer : register( b1 )
    {
        float3 Var1 : packoffset(c0);
        float2 Var2 : packoffset(c0.w); // will not compile
    }
    
    第二个问题的答案是:
    bool
    值与
    float
    占用相同的空间,因此您可以这样打包它们:

    cbuffer SomeBuffer : register( b1 )
    {
        bool SomeBool1 : packoffset(c0);
        bool SomeBool2 : packoffset(c0.y);
        float SomeFloat1 : packoffset(c0.z);
        bool SomeBool3 : packoffset(c0.w);
    }
    

    不要打包。这不是强制性的。我知道这不是必须的,但我想知道它是如何做到的。