2014-02-13 3 views
2

«Глобальные переменные и интерфейсные блоки могут быть объявлены с помощью унифицированного определителя. Это означает, что значение не изменяется между несколькими выполнениями шейдера во время рендеринга примитива (т. е. во время вызова glDraw *). Эти значения задаются пользователем из API OpenGL. Они постоянны, но не константы времени компиляции (а не const). "OpenGL Почему нужны однородные переменные (вместо простых констант)

http://www.opengl.org/wiki/Type_Qualifier_(GLSL)#Storage_qualifier

Я предполагаю, что я спрашиваю, почему унифицированные переменные не могут быть просто постоянными во время компиляции, а также.

+0

Юмор, даже если они были постоянными, которые ничего не изменили бы. Константные переменные могут использовать один и тот же пул хранения как однородные переменные. Фактически, если вы когда-либо перечисляете список униформ в связанной программе GLSL на NV-драйвере, вы заметите, что он переименовывает константы в соответствие с строками '_ _ _0' и присваивает им одинаковые местоположения. –

ответ

2

Потому что они не постоянны!

Они постоянны для каждого вызова рендеринга, но вы можете установить новое значение для каждого из них.

Например, вы можете установить униформу, содержащую значение цвета, установить ее на розовый и нарисовать вашу 3d-модель, и она будет содержать постоянное значение каждый раз, когда он вызывает фрагментарный шейдер для этой операции рисования. Но тогда вы можете нарисовать что-то еще, используя тот же шейдер с этим равномерным набором на «зеленый»