Metal 结构大小的两个例子似乎相互矛盾

Two examples of Metal struct sizes seem to contradict each other

这个结构的大小是 36 字节:

struct Mat
{
    enum Type { Lam, Met, Dia };
    int type;
    packed_float3 albedo;
    packed_float3 emissive;
    float roughness;
    float ri;
};

floats 和 ints 各为 4 个字节并且 packed_float3 为 12 个字节时,这是有意义的。

这个大小是88字节:

struct Cam
{
    packed_float3 origin;
    packed_float3 lowerLeftCorner;
    packed_float3 horizontal;
    packed_float3 vertical;
    packed_float3 u, v, w;
    float lensRadius;
};

float 是 8 个字节而 packed_float3 是 16 个字节时,这是有意义的。

这些在同一个金属着色器中。这里的对齐方式发生了什么会导致这是真的?

只有当 packed_float3 必须适合连续的 16 字节 space 时,我才能使匹配工作,因此在第一个示例中,它紧跟在第一个 int 之后, 但在第二个例子中,每个人都必须自己开始。是吗?如果是这样,这个幻数 16 似乎没有在我能在金属着色指南中找到的任何地方记录。

我认为你只是数错了。这个:

struct Cam
{
    packed_float3 origin;
    packed_float3 lowerLeftCorner;
    packed_float3 horizontal;
    packed_float3 vertical;
    packed_float3 u, v, w;
    float lensRadius;
};

相当于:

struct Cam
{
    packed_float3 origin;
    packed_float3 lowerLeftCorner;
    packed_float3 horizontal;
    packed_float3 vertical;
    packed_float3 u;
    packed_float3 v;
    packed_float3 w;
    float lensRadius;
};

那是 7 packed_float3 秒,共 21 float 秒,加上一个单独的 float,总共 22 float 秒。当 float 为 4 个字节时,即为 88 个字节。没有矛盾。