Нужно ли выполнять заполнение после каждого объявления 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
.