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;
};
当 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
是 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 个字节。没有矛盾。
这个结构的大小是 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
是 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 个字节。没有矛盾。