Например, операция уесЗ V, и; float f: v = и + f: будет эквивалентна операции

v.x = и.х + f: v.y - и.у + f;

V.Z - U.Z + f; А операция

vec3 v, u, w: w = v + и: будет эквивалентна операции

w.x = v.x + и.х: w.y = v.y + и.у: w.z = v.z + u.z: Если над вектором и скалярным числом производится бинарная операция, число используется для каждого компонента вектора. Если операция аыполняет-ея над двумя векторами, их размеры должны совпадать. Исключение - умножение вектора на матрицу или матрицы на вектор, где выполняется математическое, а не покомпонентное умножение.

Операторы приращения, уменьшения и унарного отрицания в языке шейдеров OpenGL такие же, как в С. Примененные к вектору или матрице, они выполняются над каждым компонентом по отдельности. Эти операторы выполняются над целыми или числами с плавающей запятой.

Арифметические операторы сложения (+), вычитания (-), умножения (*) и деления (/) здесь такие же, как в С, или покомпонентные, за исключением случаев математического умножения векторов и матриц:

vec4 v. и; tnat4 m:

v * u; // Покомпонентное умножение

v * m: И Математическое умножение строки-вектора на матрицу

m * v; /./ Математическое умножение матрицы на столбец-вектор

m * m; // Математическое умножение матрицы на матрицу

Все остальные операции выполняются покомпонентно.

Логическое «НЕТ» (!), логическое «И» (&&), логическое «ИЛИ» (| |) и логическое «исключающее ИЛИ» (лл) применяются только для операндов логического типа, результат их выполнения - тоже логического типа. Эти операции не могут выполняться над векторами. Существует встроенная функция not для выполнения операции покомпонентного логического «НЕТ» над векторами из булевых значений.

Операции отношений (<, >, <- и >=) выполняются только над целыми числами и числами с плавающей запятой,, результатом их выполнения являются значения

4 Зак. 218

логического типа. Существуют встроенные функции, например 1 essThanEqua 1, которые возвращают вектор логических значений как результат покомпонентного сравнения двух векторов.

Операторы сравнения (== и !=) выполняются над всеми типами, кроме массивов. Они сравнивают каждый компонент или член структуры операндов. Результат операции сравнения - логическое значение. Для того чтобы операнды оказались равны, должны совпадать типы операндов, а также значения каждого из компонентов или членов структуры с обеих сторон. Чтобы сравнить покомпонентно векторы, используются функции equal и notEqual.

Скалярные логические значения являются результатом выполнения операторов -«равно» (==), «не равно» (! =), относительных (<, >, <= и >=) и логического «НЕТ» (!) в основном потому, что операторы i f, for и другие ожидают значения такого типа. Результатом выполнения функций типа equal являются векторы из логических значений, которые можно преобразовать в скалярные логические значения с помощью встроенных функций any и all. Например, чтобы выполнить какие-нибудь действия только в случае, если хотя бы один компонент вектора меньше соответствующего компонента другого вектора, нужно написать:


⇐ вернуться назад | | далее ⇒