GLSL глобальные переменные - PullRequest
5 голосов
/ 01 января 2012

GLSL имеет много предопределенных глобальных переменных, таких как gl_lightsource.Они глобальны, потому что любой шейдер может получить к ним доступ.

Как определить пользовательские глобальные переменные в GLSL?

Ответы [ 3 ]

6 голосов
/ 02 января 2012

Глобальные переменные не существуют в GLSL. Переменные gl_* являются жестко закодированными ( воспринимается как автоматически добавленное время компиляции ) для доступа к непрограммируемым элементам конвейера из шейдера. В Core OpenGL 3.0 большинство из них было удалено, включая gl_LightSource. Теперь ожидается, что пользователь будет обрабатывать свои собственные матрицы и источники света и отправлять их шейдерам в форме. Если вы хотите увидеть список всех оставшихся, вы должны посмотреть справочные страницы GLSL .

То, что вы хотите, это униформа. Если вы хотите синхронизировать униформы между шейдерами, сохраните местоположение униформы и выполните перебор всех ваших программ, чтобы загрузить униформу в каждый шейдер.

4 голосов
/ 26 февраля 2014

Вы можете использовать одинаковые буферы. Вот учебник: http://www.lighthouse3d.com/tutorials/glsl-tutorial/uniform-blocks/

2 голосов
/ 01 января 2012

Глобальные переменные шейдера в OpenGL называются «униформой».Они доступны только для чтения и могут быть связаны с glUniformX вызовами.Примерно это выглядит так (это скорее псевдокод):

// 1. activate the program
glUseProgram(program)

// 2. get uniform location
foo = glGetUniformLocation(program, "foo")

// 3. bind the value, e.g. a single float
glUniform1f(foo, 42.0)

В шейдерах необходимо квалифицировать переменную с помощью uniform квалификатора хранилища, например

uniform float foo;
...