Передача переменной к программе построения теней GLSL OpenGL

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

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

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

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

34
задан Greg S 18 August 2013 в 13:43
поделиться

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. Он доступен только для чтения и одинаков для каждого обрабатываемого фрагмента/вершины.

Существует также несколько руководств по использованию униформы, вы можете найти их, набрав в googl "glsl uniform variable".

Надеюсь, это поможет.

62
ответ дан 27 November 2019 в 16:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: