□ attribute - для часто меняющейся информации, которая передается от приложения вершинному шейдеру;

□ uni form - для информации, которая меняется сравнительно редко и используется как вершинным, так и фрагментным шейдером;

□ varying - для интерполированной информации, передающейся от вершинного шейдера фрагментному;

□ const - для объявления неизменяемых константных идентификаторов, значения которых известны еще на этапе компиляции, как и в С.

Передача информации в шейдер и из него немного отличается от обычной передачи информации в функцию и из функции при обычном программировании. Информация передается использованием встроенных переменных и определенных разработчиком attribute-, uniform-, varying-переменных - записью в них и чтением из них. Наиболее часто используемые встроенные переменные приведены в примере в начале этой главы. Это gl_Position для передачи однородных координат вершины и gl_FragCol or для передачи цвета фрагмента из фрагментно-го шейдера (полный список всех встроенных переменных см. в главе 4). Attribute-, uniform- и varying-переменные в примерах описаны коротко, они использованы для передачи информации в шейдеры и из них. Каждый вид переменных будет описан далее в этом разделе.

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

Спецификаторы, если они нужны, указывают перед типом переменной, и так как в языке шейдеров нет типов по умолчанию, объявление любой переменной с квалификатором всегда должно содержать тип:

attribute float Temperature: const int NumLights = 3; uniform vec4 LightPosition[NumLights]; varying float lightlntensity:

3.5.1. Спецификатор attribute

Приложение использует attribute-переменные (или атрибуты) для передачи данных во фрагментный шейдер. Для каждой вершины обычно задаются новые значения либо непосредственно приложением, либо иным элементом. Существуют встроенные attribute-переменные, такие как gl J/ertex и gljtorroal, предназначенные для получения состояний OpenGL. Разработчик может объявлять и свои attribute-переменны е.

Возможность задавать типы для атрибутов ограничена: атрибутами могут быть только числа с плавающей запятой, векторы чисел с плавающей запятой и матрицы. Целые числа, логические переменные, структуры или массивы не могут быть атрибутами. Это сделано для того, чтобы увеличить производительность, так как атрибуты меняются довольно часто. Шейдер не может изменить переменные, объявленные атрибутами.

В вершинном шейдере нельзя объявлять атрибуты.

3.5.2. Спецификатор uniform

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


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