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



该结构的大小为36字节:

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

float s和int s为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 s为8个字节并且packed_float3为16字节时,这是有道理的。

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

我只有在packed_float3必须安装在连续的16字节空间中时才能使匹配起作用,因此在第一个示例中,它在第一个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 s,对于21 float s,再加上一个唯一的 float,总计22 float s。当float为4个字节时,那就是88个字节。没有矛盾。

最新更新