Язык тендеров OpenGL предоставляет также множество встроенных функций, чтобы сделать кодирование легким и лучше использовать возможности графических акселераторов для конкретных операций. Язык определяет встроенные функции для различных тригонометрических операций (синус, косинус, тангенс и Др.), операций степени (нахождение степени, экспоненты, логарифма, корня квадратного, обратного корня квадратного), общих математических операций (округление до меньшего, округление до большего, определения абсолютного зпаче2.4. Общее представление о языке ния, дробной части, модуля числа и т. д.), геометрических операций (нахождение длины, расстояния, скалярного произведения, векторного произведения, нормализация я т.д.), операций отношений для векторов (покомпонентное «больше», «меньше», «равно» и т. д.), специализированные функции фрагментного шейде-ра для вычисления производных и оценки ширины фильтра для сглаживания, функции доступа к текстурной памяти и функции, возвращающие значения шума для текстурных эффектов.

2.4.4. Дополнения из С+ +

Язык тендеров OpenGL заимствовал несколько необходимых возможностей из С++. Например, в нем поддерживается перегрузка функций, которая облегчает определение функций, различающихся только типом передаваемых аргументов. Многие встроенные функции языка шейдеров OpenGL перегружены. Например, функция для вычисления скалярного произведения перегружена для типов f 1 oat, vec2, vec3 и vec4. Идея конструкторов тоже пришла из С++. Инициализировать данные в языке шейдеров OpenGL одним или несколькими способами можно только с помощью конструкторов.

Другая возможность, позаимствованная из С++, - то, что переменные могут быть объявлены непосредственно там, где они будут использоваться, а не в начале блока. Поддерживается тип bool. Функции должны быть объявлены перед использованием: либо определением (телом функции), либо прототипом.

2.4.5. Не поддерживаемые возможности С

В отличие от ANSI С в языке шейдеров OpenGL нет неявного приведения типов. Если в выражении будут использованы переменные различных типов, компилятор воспримет это как ошибку. Например, выражение float f = 0: ошибочно, a float f = 0.0: - правильно. Это может показаться неудобным, зато упрощает язык, так как не нужно задавать и проверять правила приведения типов. Это также избавляет язык от неоднозначности при вызове функции, перегруженной по типу аргументов.


⇐ Предыдущая| |Следующая ⇒