Унифицированный буферный объект не выровнен. Доступ к GLSL

Использование GLFW, GLEW (хотя это не должно иметь значения)

При передаче структуры в шейдер фрагмента наблюдается непредвиденное поведение: если я передаю окружающий цвет напрямую:

out vec3 color
...
color = MaterialCols.ambient

Все работает так, как ожидалось. При пропуске диффузного значения он смещается на 1 (т.е. Зеленый канал красный, синий - зеленый)

При прохождении зеркального значения первое значение представляет собой зеленый канал предыдущего vec3 (диффузный).

Я считаю, что это вопрос выравнивания. Кажется, что GLSL только хочет получить доступ к компонентам vec3 при определенном выравнивании или что код C++ добавляет некоторые дополнения (по причинам, не указанным).

Это распределение данных. Он передается как единый буферный объект. При необходимости я могу добавить используемый код.

C++:

typedef struct material_colors{
 glm::vec3 ambient;
 glm::vec3 diffuse;
 glm::vec3 specular;
}material_cols;

GLSL:

uniform MaterialColors {
 vec3 ambient;
 vec3 diffuse;
 vec3 specular;
} MaterialCols;
1 ответ

Согласно замечанию derhass и соответствующему разделу 2.11.4 под названием "Единые переменные" в спецификациях OpenGL 3.2 Core:

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

Таким образом, путем добавления структуры c++ с использованием float после первого vec3, диффузор выравнивается.

c++

typedef struct material_colors{
 glm::vec3 ambient;
 float padding;
 glm::vec3 diffuse;
 glm::vec3 specular;
}material_cols;

licensed under cc by-sa 3.0 with attribution.