Это не только для GLSL, но на самом деле много языков стиля C.
vec3
является конструктором, выражение типа vec3(1,2,3)
передает аргументы 1
2
и 3
, разделенные запятой, функции конструктора, которая, в свою очередь, создаст вектор с тремя компонентами, инициализированными для заданные параметры и вернуть его.
В случае (1,2,3)
запятая действует не как разделитель, а как оператор, превращая его в список инструкций, где результат последней инструкции распространяется наружу, в данном конкретном случае 3
. Если бы вы написали (1,2,3) + 5
, результат был бы 8
. Вы можете прочитать больше об операторе запятой и некоторых типичных случаях использования в wikipedia .
Теперь перейдем к специфической части GLSL:
(1.,2.,3.)-vec3(0)
приводит к 3.-vec3(0)
, поскольку GLSL полностью относится к векторной математике, это допустимая векторно-скалярная операция, в результате чего скалярная операция применяется к отдельным компонентам вектора. в этом случае это то же самое, что и запись vec3(3.-0.,3.-0.,3.-0.)
. Другим примером будет 5.*vec3(2,3,4)
, что приведет к vec3(2*5,3*5,4*5)
=> vec3(10,15,20)
. Это не приведение типа, поскольку скалярные операции над вектором определены как таковые, точно так же, как преобразование вектора с помощью матрицы не требует преобразования одного в другой.