Это выражение эквивалентно выражению
vec3 v =* vec3(0.6. 0.6, 0.6): Такое можно проделать только с векторами. Для структур необходимо передавать значение каждому компоненту. Конструкторы матриц также имеют возможность получать только один аргумент, но при этом инициализируется только диагональ матрицы. Остальным элементам устанавливается значение 0,0: mat2 m = mat2{1.0); // создается единичная матрица 2Г2
Данное выражение эквивалентно выражению mat2 m - mat2(1.0, 0.0. 0.0, 1.0): // создается единичная матрица 2Г2
Матрицы и векторы также могут передаваться в конструкторы. При этом нужно соблюдать единственное правило - переданных компонентов должно быть достаточно для инициализации всех составляющих конструируемого объекта:
vec4 v = vec4(1.0):
vec2 u = vec2(v): // первые два компонента v инициализируют u
mat2 m = mat2{v);
vec2 t = vec2(1.0, 2.0. 3.0): // Можно. Значение 3,0 не используется Компоненты матриц и извлекаются, и заполняются по столбцам, а лишние игнорируются без предупреждений. Это может использоваться для «сжатия» значений (например, для отбрасывания значения прозрачности alpha из цвета или четвертой компоненты ю из координат).
3.4. Преобразования типов
С помощью конструкторов можно выполнять явные преобразования типов данных, например:
float f ■= 2.3: bool Ь = bool(f); Этот код выставит значение true для Ь. Такие преобразования могут оказаться полезными в операторах управления типа if, которые получают логическое значение. Булевы конструкторы преобразуют ненулевые числовые значения в true, а нулевые - в fal se.
Язык шейдеров OpenGL не предоставляет возможностей синтаксиса языка G для преобразований типов, которые могут оказаться неоднозначными. На самом деле в языке шейдеров нет способа интерпретировать какое-либо значение по-разному, предполагая какой-либо другой тип. В языке нет указателей, объединений (union), неявных преобразований типов и явных преобразований в неподходящие типы (reinterpret_cast). Вместо всего этого для преобразований типов используются конструкторы. Аргументы конструктора преобразуются в тип, для которого вызывается конструктор. Например, следующий код является правильным:
float f = float(3): // целое 3 становится числом с плавающей запятой 3,0
float g = floatfb): // преобразование логического b в число с плавающей
//запятой
vec4 v = vec4(2); it все компоненты вектора v устанавливаются в 2,0 При преобразовании из логического типа true становится 1 или 1,0, a false - нулем.
3.5. Спецификаторы и интерфейс шейдера
Перед объявлением переменных или формальных параметров функции можно указывать спецификаторы. Те из них, что используются для указания вида входных параметров функции (const, in, out, inout), описаны в разделе 3.6.2. Здесь же рассмотрим другие спецификаторы, большинство из которых формируют интерфейс шейдера. Далее приведен полный список спецификаторов, которые можно использовать вне формальных параметров функций: