2012-01-01 12 views
3

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

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

ответ

4

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

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

1

Глобальные переменные шейдера в 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; 
+0

Но тогда что, если program2 хочет получить доступ к foo? –

+0

@KevinKostlan: Ничто не мешает вам использовать одну и ту же форму в более чем одной программе. Просто следуйте приведенной выше процедуре для каждого. –

+0

Я надеялся, что у меня будет матрица камеры, которую я мог бы сделать glUniformX один раз, а затем каждый шейдер имел бы это (экономит время). Наверное, этого не существует. –

Смежные вопросы