Как и в С, в именах переменных учитывается регистр, они должны начинаться с буквы или подчеркивания, а содержать могут только буквы, цифры и подчеркивания. Определенные разработчиком переменные не могут начинаться с gl_, так как все эти имена являются зарезервированными, как и имена, в которых встречаются несколько подчеркиваний подряд (_).

12,9. Согласование и преобразование типов

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

Типы переменных, к которым применяется оператор, должны совпадать с требуемыми оператором типами. Здесь не существует неявного преобразования типов. Иногда из-за этого приходится довольно часто делать явные преобразования. Зато это упрощает язык, исключая возможность появления неочевидного кода и ошибок. Например, для языка OpenGL не существует неоднозначностей при использований перегруженных функций.

3.3. Инициализаторы и конструкторы

Переменные шейдера можно инициализировать вместе с объявлением. Следующий пример инициализирует Ь, оставляя а и с не определенными: float а. b = 3.0. с: Переменные, объявленные константными, должны быть инициализированы обязательно:

const int Size = 4: // требуется значение для инициализации

Attribute-, uniform- и varying-переменные нельзя инициализировать при объявлении:

attribute float Temperature; // инициализатора нет

// значение устанавливается вершинным API

uniform int Size: // инициализатора нет.

// значение устанавливается uniform-API

varying float density; // инициализатора нет.

// значение устанавливается вершинным шейдером Чтобы инициализировать составные типы либо на этапе объявления, либо позже, используются конструкторы. Это единственный способ инициализации, так как язык шейдеров не заимствовал из С синтаксис с фигурными скобками ({…}). Конструкторы похожи на вызовы функций, где вместо имени функции подставляется имя типа. Например, чтобы инициализировать вектор vec4 значениями (1,0, 2,0,3,0,4,0), нужно написать: vee4 v = vec4C1.0. 2.0. 3.0. 4.0): или, что то же самое: vec4 v;

v = vec4C1.0. 2.0, 3.0. 4.0): Конструкторы существуют для всех встроенных типов, кроме семплеров, и для структур.

Приведем несколько примеров:

vec4 v = vec4(l.Q, 2.0, 3.0, 4.0): ivec2 е = ivec2{3, 4): vec3 color = vec3(0.2, 0.5. 0.8): mat2 m - mat2C1.0, 2.0. 3.0. 4.0); struct light {

vec4 position: struct lightColor {

vec3 color: float intensity:

}

] lightl = lightfv. lightCo1or(color. 0,9)): В приведенных примерах для каждого компонента инициализируемой переменной в конструктор передавалось значение. Во встроенные конструкторы для векторов можно передать всего одно значение, которое распространяется на все элементы вектора:

vec3 v = vec3(0.6):


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