Использование одного и того же шейдерного кода в нескольких процессах

Являются ли переменные шейдера и однородные переменные уникальными в разных приложениях?

У меня есть ситуация, когда мне нужно иметь несколько процессов (фактически отдельных программ), которые используют шейдерный код с одинаковыми именами переменных, за исключением одной униформы. Каждый процесс должен иметь свой шейдер, независимый от других. Когда я вызываю 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);

все взгляды верны. Что мне не хватает?

Извините за длинный пост, но мне было трудно придумать адекватное описание проблемы.

0 ответов

Другие вопросы по тегам