Определение языка
Приведем несколько примеров:
vec4 v = vec<Hl.Q. 2.0. 3.0. 4.0):
ivec2 с = ivec2{3. 4):
vec3 color = vec3(0.2. 0.5. 0.8):
irat2 m - mat2(1.0, 2.0. 3.0. 4.0);
struct light
{
vec4 position; struct HghtColor {
vec3 color: float intensity:
}
) lightl = light(v. lightColortcolor. 0.9)):
Порядок заполнения компонентов матриц - по столбцам. Переменная m из предыдущего примера - это матрица
"1,0 3,0" 2,0 4,0_
В приведенных примерах для каждого компонента инициализируемой переменной в конструктор передавалось значение. Во встроенные конструкторы для векторов можно передать всего одно значение, которое распространяется на все элементы вектора:
vec3 v = vec3(0.6);
Это выражение эквивалентно выражению vec3 v - vec3(0.6. 0.6, 0.6): Такое можно проделать только с векторами. Для структур необходимо передавать значение каждому компоненту. Конструкторы матриц также имеют возможность получать только один аргумент, но при этом инициализируется только диагональ матрицы. Остальным элементам устанавливается значение 0,0: mat2 m = mat2(1.0): // создается единичная матрица 2Г2
Данное выражение эквивалентно выражению mat2 m -rnat2(1.0. 0.0. 0.0. i.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 из цвета или четвертой компоненты w из координат).
3.5, Спецификаторы и интерфейс шейдера
3.4. Преобразования типов С помощью конструкторов можно выполнять явные преобразования типов данных, например: