gpt4 book ai didi

c++ - HLSL 常量缓冲区中数组的意外大小

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:10:44 26 4
gpt4 key购买 nike

我还没有在这里使用过像这样更复杂的 CB,但据我了解,我的 C++ 对齐和打包必须符合 HLSL 的预期。所以我正在尝试 figure out the rules所以我可以预测地布置 C++ struct 以匹配 HLSL 的预期。

我在 Vertex Shader v5 中进行了一些测试,以查看输出中产生的打包,并在 vs.hlsl 中使用了此结构:

cbuffer conbuf {
float m0;
float m1;
float4 m2;
bool m3[1];
bool m4[4];
float4 m5;
float m6;
float4 m7;
matrix m8;
float m9;
float m10;
float4 m11[2];
float m12[8];
float m13;
};

产生了以下输出(在 Header File Name VC++ Project HLSL Settings 中):

cbuffer conbuf {
float m0; // Offset: 0 Size: 4
float m1; // Offset: 4 Size: 4
float4 m2; // Offset: 16 Size: 16
bool m3; // Offset: 32 Size: 4
bool m4[4]; // Offset: 48 Size: 52
float4 m5; // Offset: 112 Size: 16
float m6; // Offset: 128 Size: 4
float4 m7; // Offset: 144 Size: 16
float4x4 m8; // Offset: 160 Size: 64
float m9; // Offset: 224 Size: 4
float m10; // Offset: 228 Size: 4
float4 m11[2]; // Offset: 240 Size: 32
float m12[8]; // Offset: 272 Size: 116
float m13; // Offset: 388 Size: 4
};

我很清楚偏移量是如何工作的(基于大小),但我无法理解数组大小。

这里的一些数组大小似乎是随机的。 我无法弄清楚 bool m4[4] 数组的大小如何:52。对于大小为 116 的 float m12[8] 也是如此。 HLSL 编译器如何设法生成这些大小?

有什么帮助吗? 我已经查看了 MSDN packing page但他们对数组的讨论不多。

最佳答案

我会稍微简化你的例子,因为你已经得到了填充。

根据打包规则(您提到的链接),数组的一个重要部分是:

Arrays are not packed in HLSL by default. To avoid forcing the shader to take on ALU overhead for offset computations, every element in an array is stored in a four-component vector.

让我们以这个简单的 cbuffer 为例:

cbuffer cbPerObj : register( b0 )
{
float Alpha[4];
};

根据上述规则(每个 float 存储在四个 vector 中),这将(几乎)等同于:

cbuffer cbPerObj : register( b0 )
{
float4 Alpha[4];
};

或(展开)

 cbuffer cbPerObj : register( b0 )
{
float Alpha1;
float3 Dummy1;
float Alpha2;
float3 Dummy2;
float Alpha3;
float3 Dummy3;
float Alpha4;
};

正如您所注意到的,您的最后一个元素没有被填充,这就是为什么您会注意到您的情况:

bool m4[4]; // Offset: 48 Size: 52
float4 m5; // Offset: 112 Size: 16

m4 为 16*4 = 64(减去最后 3),64-12 = 52

当然你也可以注意到,48 + 52 = 100(因为m5不需要越界,所以你可以找到偏移量丢失的12个字节)

如果你有,

bool m4[4]; // Offset: 48 Size: 52
float m5;

m5 的偏移量为 100,因为它可以适应边界。

希望这是有道理的。

关于c++ - HLSL 常量缓冲区中数组的意外大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24276402/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com