Подтвердить что ты не робот

Передача переменной в шейдер OpenGL GLSL

Я пишу приложение для iPhone, которое использует шейдеры GLSL для выполнения преобразований на текстурах, но один момент, с которым я немного затруднился, заключается в передаче переменных в мой шейдер GLSL.

Я читал, что возможно иметь часть чтения шейдера в состоянии OpenGL (и мне нужен только доступ только для чтения к этой переменной), но я не уверен, как произойдет этот обмен.

Короче говоря, я пытаюсь получить значение float, созданное вне шейдера фрагмента, для доступа к шейдеру фрагмента (независимо от того, прошел он или читал внутри шейдера).

Спасибо за любую помощь/указатели, которые вы можете предоставить, это очень ценится!

4b9b3361

Ответ 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".

Я надеюсь, что это поможет.