Использование одного и того же шейдерного кода в нескольких процессах
Являются ли переменные шейдера и однородные переменные уникальными в разных приложениях?
У меня есть ситуация, когда мне нужно иметь несколько процессов (фактически отдельных программ), которые используют шейдерный код с одинаковыми именами переменных, за исключением одной униформы. Каждый процесс должен иметь свой шейдер, независимый от других. Когда я вызываю glCreateProgram() и glCreateShader(), я получаю одинаковые идентификаторы для программ и шейдеров в каждом процессе, поэтому кажется, что процесс "a" ничего не знает о процессе "b". Однако, если используется уникальная униформа в процессе "b", изображение не отображается правильно в процессе "b". Если код шейдера в процессе 'a' содержит униформу, используемую в процессе 'b', все работает нормально. Почему изменение чего-либо в процессе "а" влияет на процесс "б"?
Мы хотим иметь один и тот же источник шейдеров для всех процессов, за исключением использования одной униформы, которая не находится в первом процессе, но должна быть все остальные.
Во всех приложениях:
first call to glCreateShader() returns 1
second call to glCreateShader() returns 2
first call to glCreateProgram() returns 3
и так далее.
В коде шейдера для процесса 'a':
uniform vec2 first;
uniform vec4 second;
uniform vec4 third;
varying float forth;
...
main()
{
gl_Position = second * third;
forth = somecalculation; // used in fragment shader
}
В коде шейдера для других процессов:
uniform vec2 first;
uniform vec4 second;
uniform vec4 third;
varying float forth;
uniform vec2 unique;
...
main()
{
gl_Position = second * third;
gl_position.x += unique.x;
gl_position.y += unique.y;
forth = somecalculation; // used in fragment shader
}
Приведенный выше метод создает неправильный вид, цвета неправильные. Если код в приложении "а" включает в себя уникальную униформу, и унифицированные значения установлены в 0.0f, то проблем нет. Так что если код шейдера для всех процессов выглядит так:
uniform vec2 first;
uniform vec4 second;
uniform vec4 third;
varying float forth;
uniform vec2 unique;
...
main()
{
gl_Position = second * third;
gl_position.x += unique.x;
gl_position.y += unique.y;
forth = somecalculation; // used in fragment shader
}
и приложение "а" на процессоре делает:
GLfloat unique[2];
GLint location = glGetUniformLocation(program, "unique");
unique[0] = 0.0f;
unique[1] = 0.0f;
glUniform2fv(location, 1, unique);
все взгляды верны. Что мне не хватает?
Извините за длинный пост, но мне было трудно придумать адекватное описание проблемы.