И мой фрагментный, и вершинный шейдеры содержат следующих двух парней:
struct Light {
mat4 view;
mat4 proj;
vec4 fragPos;
};
layout (std430, binding = 0) buffer Lights {
Light lights[];
};
Моя проблема в том, что это последнее поле, fragPos
, вычисляется вершинным шейдером следующим образом, но фрагментный шейдер не видит изменения, сделанные вершинным шейдером в fragPos
(или вообще какие-либо изменения):
aLight.fragPos = bias * aLight.proj * aLight.view * vec4(vs_frag_pos, 1.0);
... где aLight
равно lights[i]
в цикле. Как вы понимаете, я вычисляю положение вершины в системе координат каждого присутствующего источника света, чтобы использовать ее в отображении теней. Есть идеи, что здесь не так? Я делаю в корне неправильную вещь?
Вот как я инициализирую свое хранилище:
struct LightData {
glm::mat4 view;
glm::mat4 proj;
glm::vec4 fragPos;
};
glGenBuffers(1, &BBO);
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, BBO);
glNamedBufferStorage(BBO, lights.size() * sizeof(LightData), NULL, GL_DYNAMIC_STORAGE_BIT);
// lights is a vector of a wrapper class for LightData.
for (unsigned int i = 0; i < lights.size(); i++) {
glNamedBufferSubData(BBO, i * sizeof(LightData), sizeof(LightData), &(lights[i]->data));
}
Возможно, стоит отметить, что если я перемещу fragPos
в переменную массива out
фиксированного размера в вершинном шейдере out fragPos[2]
, оставлю результаты там, а затем добавлю аналог фрагментного шейдера in fragPos[2]
и буду использовать его для остальных моих вещей, тогда все будет в порядке. Итак, о чем я хочу узнать больше, так это о том, почему мой фрагментный шейдер не видит числа, обработанные вершинным шейдером.