此结构的大小为36个字节:
struct Mat
{
enum Type { Lam, Met, Dia };
int type;
packed_float3 albedo;
packed_float3 emissive;
float roughness;
float ri;
};
当float
和int
分别为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
。
答案 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字节。没有矛盾。