Шейдер не может изменять uniform-переменные. Это важно, так как несколько обработчиков могут совместно использовать одни и те же ресурсы, и поэтому изменение переменных внутри шейдера может вызвать ошибки.

Несмотря на то что семплер (например, samp1er2D) может являться параметром функции, для его объявления все равно нужно использовать спецификатор uniform, так как семплеры непрозрачны. Такое объявление поможет проверить, что семплер инициализирован текстурой и текстурный модуль правильно используется внутри шейдера.

3.5.3. Спецификатор varying

Через переменные, объявленные как varying, вершинный шейдер передает результаты вычислений фрагментному шейдеру. Из таких переменных во время выполнения формируется интерфейс между вершинным и фрагментным шейдерами. Для каждого атрибута, принадлежащего примитиву, и каждой вершины должно быть задано свое значение, и эти значения интерполируются для фрагментов примитива. Вершинный шейдер записывает значения каждой вершины в varying-переменную, и когда фрагментный шейдер читает из нее, он получает интерполированное между вершинами значение. Если для какого-либо атрибута интерполяция не требуется, вершинный шейдер вообще не должен передавать никаких значений фрагментному. Вместо этого приложение само передаст нужное значение фрагментному шейдеру через uniform-переменную.

Наряду с использованием этих переменных для интерполированных значений, их можно использовать также для любого значения, которое будет часто изменяться - с каждым новым треугольником, или группой треугольников, или вершиной. Быстрее было бы передать эти значения в attribute-переменные и потом переадресовать как varying-переменные, так как частое использование uniform-переменных может плохо повлиять на производительность.

Автоматическая интерполяция переменных, определенных как varying, выполняется с учетом перспективы, и не имеет значения, какой тип данных интерполируется. В противном случае такие значения не сглаживались бы правильно на гранях при разделении поверхностей. Результат интерполяции был бы непрерывным, но его производная не была бы определена.

Обычно вершинный шейдер устанавливает varying-переменную, а фрагментный шейдер ее использует, не имея возможность изменить значение. Вершинный шейдер может читать из переменной записанное перед этим значение. Попытка получить значение переменной до записи в нее возвращает непредсказуемое значение.

3.5.4. Спецификатор const

Переменные, объявленные как const, обычно являются константами времени компиляции (кроме объявленных const формальных параметров функций), они не видимы вне шейдера, внутри которого объявлены. Поддерживаются также константы составных типов:

const int numlterations = 10; const float pi = 3.14159: const vec2 v = vec2(1.0. 2.0):

const vec3 u - vec3(v. pi): const struct light {

vec3 position; vec3 color;

} fixedLight = light(vec3(1.0. 0.5. 0.5). vec3(0.8. 0.8. 0.5).); Все эти значения - константы времени компиляции. Компилятор может копировать и сжимать константы во время компиляции, используя точность процессора, на котором выполняется компилятор, а во время выполнения такие константы не требуют ресурсов,


⇐ вернуться назад | | далее ⇒