Язык шейдеров OpenGL имеет множество удобных встроенных функций для операций над скалярными числами и векторами. Основная часть этих функций относятся к одной из трех категорий.
1. Функции, удобно дополняющие какую-либо аппаратную функциональность, например доступ к текстурным картам. Эти функции нельзя имитировать в шейдере.
2. Функции для тривиальных операций (преобразование, смешивание и т. д.); они просты в использовании, но очень общие, поэтому должны непосредственно поддерживаться аппаратной базой.
3. Функции для операций, которые в той или иной мере ускоряются с помощью графического ускорителя. Тригонометрические функций тоже относятся к этой категории.
Довольно много функций носят такие же имена, как и функции из библиотек языка С, но здесь они могут принимать и векторные аргументы. Так как язык шейдеров OpenGL поддерживает перегрузку функций, встроенные в язык функции обычно имеют несколько вариантов с одним и тем же именем, различающихся Типами входных и возвращаемого значений. Большинство функций существует в четырех вариантах: одна получает float-аргументы и возвращает float, вторая получает уес2-аргументы и возвращает vee2, третья получает vec3-apryMeHTbi и возвращает vec3, четвертая получает уес4-аргументы и возвращает vec4.
Всякий раз при необходимости выполнять описанные вычисления предпочтительно использовать функции, а не писать собственный код. Ожидается, что встроенные функции сделаны наиболее оптимально, иногда даже поддерживаются аппаратно. Почти все встроенные функции можно использовать и в вершинном, и во фрагментном шейдере, но некоторые из них доступны только для шейдеров одного вида. Можно также заменить встроенную функцию, объявив ее заново и определив в коде шейдера с теми же именем и списком аргументов.
В качестве иллюстраций далее будет приведено графическое представление некоторых функций. Эти функции просты, и читателям не составит труда нарисовать их графики самостоятельно. Но, как будет вил1^ последующих глав, многие из этих функций можно использовать в шейдерах, чтобы добиться инте-ресных эффектов. При написании кода шейдера иногда бывает полезно нарисовать график функции, чтобы понять, каким будет вычисленное значение в данном месте шейдера. По некоторым приведенным здесь графикам будет легче понять, как нарисовать остальные и для чего можно пытаться использовать эти функции. Некоторые из применений таких функций читатель увидит в последующих главах книги.
5.1. Угловые и тригонометрические функции
Тригонометрические функции можно использовать и в вершинных, и во фрагментных шейдерах. Если параметр функции - угол, он обозначается в радианах. Ни одна из этих функций не генерирует ошибки деления на ноль. При пулевом делителе результаты выполнения функции не определены.
Вее перечисленные далее функции выполняются покомпонентно (табл. 5.1).
Таблица 5.1. Угловые и тригонометрические функции
Синтаксис |
Описание |
float radians (float degrees) |
Переводит градусы в радианы и возвращает результат, |
vec2 radians (vec2 degrees) |
а именно: result = 7Г/1В0 degrees |
vec3 radians (vec3 degrees) | |
vsc4 radians (vec4 degrees) | |
float degrees (float radians) |
Переводит радианы в градусы и возвращает результат, |
vec2 degrees (vec2 radians) |
а именно: result = 180/тг radians |
vec3 degrees (vec3 radians) | |
vec4 degrees (vec4 radians) | |
float sin (float radians) |
Стандартная тригонометрическая функция синуса. |
vec2 sin (vec2 radians) |
Значение, которое возвращает эта функция, |
vec3 sin (vec3 radians) |
находится в диапазоне [-1,1] |
vec4 sin (vec4 radians) | |
float cos (float radians) |
Стандартная тригонометрическая функция косинуса. |
vec2 cos (vec2 radians) |
Значение, которое возвращает эта функция, |
vec3 cos (vec3 radians) |
находится в диапазоне [-1,1] |
vec4 cos (vec4 radians) | |
float tan (float radians) |
Стандартная тригонометрическая функция тангенса |
vec2 tan (vec2 radians) | |
vec3 tan (vec3 radians) | |
vec4 tan (vec4 radians) | |
float asin (float x) |
Арксинус, Возвращает угол, синус которого равен х. |
vec2 asin (vee2 x) |
Диапазон возвращаемых значений [-л/2, л/2]. |
vec3 asin (vec3 x) |
При | х | > 1 результаты не определены |
vec4 asin (vec4 x) | |
float acos (float x) |
Арккосинус. Возвращает угол, косинус которого равен х. |
vec2 acos (vec2 x) |
Диапазон возвращаемых значений [0, л]. При | х \ > 1 |
vec3 acos (vec3 x) |
результаты не определены |
yec4 acos (vec4 x) |
Синтаксис |
Описание |
float atan (float у. float x) |
Арктангенс. Возвращает угол, тангенс которого |
vec2 atan (vec2 y. vec2 x) |
равен у/х. По знакам входных значений лги /определя |
vec3 atan (vec3 у. vec3 x) |
ется, в какой четверти находится угол. Диапазон воз |
v?c;l atan (vec4 y, vec4 x) |
вращаемых значений [-я, я]. При х= 0 и у =0 |
результаты не определены | |
float atan (float у over x) |
Арктангенс. Возвращает угол, тангенс которого y_over_x. |
vec2 atan (vec2 у over x) |
Диапазон возвращаемых значений [-л/2, тт/2] |
vec3 atan (vec3 у over x) | |
vec4 atan (vec4 у over x) |
Приведенные функции используют в основном как тригонометрические, но отуе и косинус можно использовать также и для других целей, например как ос-нову для функции сглаживания (рис, 5.1), а также для моделирования волн напо-зерхпости предметов, для создания равномерных полос разных материалов, имитации качания объекта и для других целей.