Размер этой структуры составляет 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
s составляют 8 байтов, а packed_float3
составляет 16 байтов.
Это в одном и том же металлическом шейдере. Что происходит с выравниванием здесь, что могло бы сделать это правдой?
Я могу заставить совпадение работать, только если packed_float3
должен уместиться в непрерывном 16-байтовом пространстве, поэтому в первом примере он помещается сразу после первого int
, но во втором примере каждый должен начинать его своя. Это оно? Если это так, то это магическое число 16
, по-видимому, нигде не задокументировано в руководстве по затенению металла.