Я пишу приложение для iPhone, которое использует программы построения теней GLSL для выполнения преобразований на структурах, но одна точка, с которой у меня есть немного трудного времени, передает переменные моей программе построения теней GLSL.
Я считал, что возможно иметь часть чтения программы построения теней состояния OpenGL (и мне только был бы нужен доступ только для чтения к этой переменной), но я не уверен, как тот обмен произошел бы.
Короче говоря, я пытаюсь создать значение плавающее за пределами программы построения теней фрагмента, чтобы быть доступным для программы построения теней фрагмента (передается ли она в или читается из программы построения теней).
Спасибо за любую справку/указатели можно обеспечить, она очень ценится!
Одним из вариантов является передача информации через унифицированные переменные.
После
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
. Он доступен только для чтения и одинаков для каждого обрабатываемого фрагмента/вершины.
Существует также несколько руководств по использованию униформы, вы можете найти их, набрав в googl "glsl uniform variable".
Надеюсь, это поможет.