该结构的大小为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个字节。没有矛盾。