金属结构尺寸的两个例子似乎相互矛盾

时间:2019-03-17 23:24:43

标签: metal metal-performance-shaders

此结构的大小为36个字节:

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

floatint分别为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字节时,这是有道理的。

这些位于相同的Metal着色器中。此处的对齐方式发生了什么,这将使这成为事实?

仅当packed_float3必须适合连续的16字节空间时,我才能使匹配工作,因此在第一个示例中,它恰好适合第一个int之后,但是在第二个示例中每个人都必须自己开始。是吗如果是这样,我在《金属着色》指南中找不到的任何地方都没有记载这个神奇的数字16

1 个答案:

答案 0 :(得分:3)

我认为您只是在数错。这个:

fetch(downurl1)

等效于:

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

总共7个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; }; ,共21个packed_float3,外加一个单独的float,共22个float。当float为4字节时,即88字节。没有矛盾。