DirectX11 和数据包偏移

发布于 2024-10-12 12:00:41 字数 347 浏览 1 评论 0原文

有谁知道如何在 DirectX10/11 中使用 bool 类型的“packetoffset”?我不确定这应该如何对齐

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; ??
}

Does anyone know how to use "packetoffset" with a bool type in DirectX10/11? I am not sure how this should be aligned

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; ??
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

山有枢 2024-10-19 12:00:41

这实际上是两个问题:

  1. 如果您使用 packoffset 导致变量超出单个寄存器的范围,会发生什么?
  2. 如何将 packoffsetbool 值一起使用?

第一个问题的答案是:HLSL 编译器将对 packoffset 值进行一些验证。因此,以下内容将无法编译,因为Var2无法放入c0,并且编译器不会自动将其“包装”为< code>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);
}

That's actually two questions:

  1. What happens if you use a packoffset that results in a variable extending beyond the bounds of a single register?
  2. How do you use packoffset with bool values?

The answer to the first question is: The HLSL compiler will do some validation on the packoffset values. So the following will not compile, because Var2 can't fit in to c0, and the compiler will not automatically "wrap" it into c1:

cbuffer SomeBuffer : register( b1 )
{
    float3 Var1 : packoffset(c0);
    float2 Var2 : packoffset(c0.w); // will not compile
}

The answer to the second question is: bool values take the same space as a float, so you can pack them like this:

cbuffer SomeBuffer : register( b1 )
{
    bool SomeBool1 : packoffset(c0);
    bool SomeBool2 : packoffset(c0.y);
    float SomeFloat1 : packoffset(c0.z);
    bool SomeBool3 : packoffset(c0.w);
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文