Не передаётся значение в фрагментный шейдер GLSL, при использовании функций OpenGL 4.6 SSO

При попытке передать значение цвета в фрагментный шейдер, в юниформе отведённой под это, оказывается 0. Если не использовать SSO, то, всё работает правильно. Также, функция glGetUniformLocation, судя по её спецификации, в которой сказано:

Эта функция возвращает -1, если имя не соответствует активной юниформ-переменной в программе, если имя начинается с зарезервированного префикса "gl_" или если имя связано с атомарным счетчиком или именованным юниформ-блоком.

отрабатывает без ошибок и возвращает 0. Соответственно, скорее всего, либо я неправильно использую функцию glUniform*f, либо как то не так создаю шейдерный конвейер. К сожалению информацию по этому поводу в интернете не нашёл.

Код фрагментного шейдера:

#version 330 core
out vec4 color;
uniform vec4 ourColor;
void main()
{
color = ourColor;
}

Вот так создаю шейдерный конвейер:

std::uint32_t pipe;
glCreateProgramPipelines(1, &pipe);

std::uint32_t fprog = glCreateShaderProgramv(GL_FRAGMENT_SHADER, 1, &fragmentShaderSource);
std::uint32_t vprog = glCreateShaderProgramv(GL_VERTEX_SHADER, 1, &vertexShaderSource);

glCreateProgramPipelines(1, &pipe);
glBindProgramPipeline(pipe);

glUseProgramStages(pipe, GL_FRAGMENT_SHADER_BIT, fprog);
glUseProgramStages(pipe, GL_VERTEX_SHADER_BIT, vprog);

Цикл отрисовки:

while (!glfwWindowShouldClose(window))
{
    // Очистка окна...
    ...

    glBindProgramPipeline(pipe);

    GLfloat timeValue = glfwGetTime();
    GLfloat greenValue = (sin(timeValue) / 2) + 0.5;
    GLint vertexColorLocation = glGetUniformLocation(fprog, "ourColor");
    glUniform4f(vertexColorLocation, 0.0f, greenValue, 0.0f, 1.0f);

    // Отрисовка вершинного массива...
    ...
}

Ответы (1 шт):

Автор решения: Ivan Smolyanov

Проблема была решена использованием функции glProgramUniform*f вместо glUniform*f.

→ Ссылка