В glsl struct мне нужно сделать padding для типов vec2 (используя layout std430) - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть код glsl:

struct PStruct{
  vec2 P1;
  vec2 P2;
}
layout(std430) buffer MyList 
  {
    PStruct list[];
  }

Нужно ли выполнять заполнение после каждого объявления vec2 P1 для получения правильного выравнивания на языке C:

struct PStruct{
  float P1[2];
  float padding1[2];
  float P2[2];
  float padding2[2];
}

1 Ответ

0 голосов
/ 20 сентября 2018

Нужно ли выполнять заполнение после каждого объявления vec2 P1 для правильного выравнивания на языке C:

Нет, вы не можете этого сделать.

В GLSL размер структуры PStruct составляет 16 байт, а P1 и P2 выровнены по 8 байтов:

struct PStruct{
    vec2 P1;
    vec2 P2;
}

Это приводит к тому, что buffer MyList будет плотно упакован

layout(std430) buffer MyList 
{
    PStruct list[];
}

Это соответствует следующей структуре в C, которая имеет размер 16 байтов, P1 и P2 имеют размер 8 байтов и выровнены по 4 байта:

struct PStruct{
    float P1[2];
    float P2[2];
}

Для объяснения см. Правила 2, 4 и 9 макета std140 соответственно std340:

См. Спецификация профиля ядра API OpenGL 4.6;7.6.2.2 Стандартная единообразная схема блоковстраница 144 :

....

Если элемент представляет собой двух- или четырехкомпонентный вектор с компонентами, потребляющими N базовых машинных единиц, выравнивание базы составляет 2N или 4N, соответственно.

...

Если элемент является массивом скаляров или векторов, базовое выравнивание и шаг массива устанавливаются так, чтобы соответствовать базовому выравниванию одного элемента массива, согласно правилам (1), (2) и (3), иокругляется до базового выравнивания в vec4.Массив может иметь заполнение в конце;базовое смещение элемента, следующего за массивом, округляется до следующего кратного базового выравнивания.

...

Если элемент является структурой, базовое выравнивание структуры равно N, где N - наибольшее значение базового выравнивания любого из его элементов, и округлено до базового выравнивания vec4.

...

При использовании схемы хранения std430 блоки хранения шейдеров будут размещаться в буферном хранилище идентично унифицированным и шейдерным хранилищам с использованием схемы std140, за исключениемвыравнивание базы и шаг массивов скаляров и векторов в правиле 4 и структур в правиле 9 не округляются в кратную от базового выравнивания vec4.

...