Ответ 1
Один из вариантов - передавать информацию через однородные переменные.
После
glUseProgram(myShaderProgram);
вы можете использовать
GLint myUniformLocation = glGetUniformLocation(myShaderProgram, "myUniform");
и, например,
glUniform1f(myUniformLocation, /* some floating point value here */);
В вашем шейдере вершин или фрагментов вам нужно добавить следующее объявление:
uniform float myUniform;
Чтобы он в вашем шейдере теперь мог получить доступ (только для чтения) значение, которое вы передали ранее, через glUniform1f
.
Конечно, равномерными переменными могут быть любые допустимые типы GLSL, включая сложные типы, такие как
как массивы, структуры или матрицы. OpenGL предоставляет функцию glUniform
с помощью обычных суффиксов,
подходит для каждого типа. Например, чтобы назначить переменной типа vec3
, можно было бы
используйте glUniform3f
или glUniform3fv
.
Примечание: значение не может быть изменено во время выполнения шейдера, то есть в блоке glBegin
/glEnd
. Он доступен только для чтения и одинаковый для всех обработанных фрагментов/вершин.
Есть также несколько учебников с использованием униформы, вы можете найти их с помощью googling "однородная переменная glsl".
Я надеюсь, что это поможет.