Язык шейдеров 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), а также для моделирования волн напо-зерхпости предметов, для создания равномерных полос разных материалов, имитации качания объекта и для других целей.


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