Передача переменной в шейдер OpenGL GLSL - PullRequest
32 голосов
/ 12 июля 2010

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

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

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

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

1 Ответ

60 голосов
/ 12 июля 2010

Один из вариантов - передавать информацию через однородные переменные.

* После 1003 *

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

Есть также несколько учебных пособий, использующих униформу, вы можете найти их, прибегая к помощи "glsliform variable".

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

...