Два примера размеров металлоконструкций, кажется, противоречат друг другу - PullRequest
0 голосов
/ 18 марта 2019

Размер этой структуры составляет 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, по-видимому, нигде не задокументировано в руководстве по затенению металла.

1 Ответ

3 голосов
/ 18 марта 2019

Я думаю, вы просто ошибаетесь.Это:

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 s.Когда float равен 4 байта, это 88 байтов.Там нет противоречия.

...