float sin(float х):
3.7. Операции Если шейдер хочет переопределить эту функцию или специализировать ее для конкретного типа параметров, это можно сделать следующим образом: float sir (float х)
{
return <.. какая-то функция от х..>
)
void maint)
{
// вызывается функция, определенная ранее, а не встроенная float s = sin(x):
)
Это напоминает стандартные приемы компоновки разных библиотек и функций, где преимуществом обладает локальная функция - если функция определена, то вызывается именно она, а не функция из внешней библиотеки. Если определение такой функции находится в другом шейдере, нужно просто перед вызовом этой функции указать в текущем шейдере ее прототип. В противном случае будет использоваться встроенная функция.
3,7. Операции В табл. 3.1 в порядке приоритетности приведены операторы, доступные в языке шейдеров OpenGL. Приоритетность и ассоциативность совместимы с С.
Таблица 3.1. Операторы в порядке приоритетности
Оператор |
Описание |
[] |
Индекс |
Выбор компонента |
|
++ - |
Постфиксный инкремент/декремент |
++ - |
Префиксный инкремент/декремент |
! |
Унарное отрицание и логическое «НЕ» |
*/ |
Умножение и деление |
+ - |
Сложение и вычитание |
<><=>= |
Относительные |
= = ! = |
Равенства |
т. |
Логическое «И» |
Л Л |
Логическое «исключающее ИЛИ» |
II |
Логическое «ИЛИ» |
Выбор |
|
= += -= *= /= |
Присваивание |
Последовательность |
3.7.1. Обращение по индексу
К векторам, матрицам и массивам можно обращаться с помощью оператора индекса ([ ]). Все индексы начинаются с нуля; первый элемент всегда имеет индекс 0. Индексирование массива такое же, как в С.
Определение языка
Оператор индекса для вектора возвращает скалярный компонент. Это позволяет компонентам вектора иметь номера 0, 1… и обеспечивает произвольный доступ к ним, например:
vec4 V = vec4(l.G. 2.0, 3.0. 4.0):
float f = v[2]: // f принимает значение 3.0
В данном случае v[2] - скалярное значение с плавающей запятой 3,0, которое присваивается f.
Применение оператора индекса к матрице возвращает соответствующий столбец матрицы в виде вектора, например: