3.3. Инициализаторы и конструкторы
12,9. Согласование и преобразование типов Язык шейдеров OpenGL является строго типизированным. Связываемые типы должны соответствовать друг другу: аргумент, передаваемый в функцию, должен соответствовать формальному объявлению данного параметра функции, а типы, с которыми производятся операции, должны соответствовать требованиям конкретного оператора.
Типы переменных, к которым применяется оператор, должны совпадать с требуемыми оператором типами. Здесь не существует неявного преобразования типов. Иногда из-за этого приходится довольно часто делать явные преобразования. Зато это упрощает язык, исключая возможность появления неочевидного кода и ошибок. Например, для языка OpenGL не существует неоднозначностей при использовании перегруженных функций.
3.3. Инициализаторы и конструкторы
Переменные шейдера можно инициализировать вместе с объявлением. Следующий пример инициализирует Ь, оставляя а и с не определенными: float a. 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 = vec4tl.Q. 2.0. 3.0. 4.0):
или, что то же самое:
vec4 v:
v = vec4(l-0. 2.0, 3.0. 4.0):
Конструкторы существуют для всех встроенных типов, кроме семплеров, и для структур.