Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Глава 38. Шейдеры GLSL. Немного о спецификации

Поиск

Все числа в шейдере и все числа, передаваемые через юниформы, должны быть с точкой, т.е. 5.0, 1.0, 1.1. Это особенность видеокарт ATI.

Типы данных и переменные

 

В GLSL доступны следующие простые типы данных: float, bool, int. Эти типы данных точно такие же, как в C. Также доступны векторы для перечисленных выше типов данных с двумя, тремя или четырьмя компонентами. Она обьявляются как:

vec{2,3,4} — вектор из 2/3/4 float

bvec{2,3,4} — вектор из 2/3/4 bool

ivec{2,3,4}— вектор из 2/3/4 int

Также доступны квадратные матрицы 2x2, 3x3 и 4x4, соответствующие типы данных: mat{2,3,4}. Можно задать матрицу и произвольного размера, вот так задаётся матрица 4х2:

vec4 MyMatrix[2];

Обратите внимание, последний элемент матрицы из примера это [1][3].

Также доступен ряд специальных типов данных для работы с текстурами. Они называются «samplers» и нуждаются в доступе к значениям текстур, так же известным как текселы. Типы данных:

sampler1D — для 1D-текстур

sampler2D — для 2D-текстур

sampler3D — для 3D-текстур

samplerCube — для текстур кубических карт

sampler1DShadow — для карт теней

sampler2DShadow — для карт теней

Массивы в шейдерах объявляются так же, как в C, однако они не могут быть инициализированы при объявлении. Доступ к элементам — такой же, как в C или Delphi.

Также в GLSL доступны структуры. Синтаксис такой же, как в C:

struct TerrainRegion

{

float min;

float max;

};

uniform TerrainRegion region1;

То есть для использования структуры нужно, помимо создания её самой, создать ещё и юниформ переменную типа этой структуры. Обращатся из Delphi программы к GLSL структуре вы будете по образцу:

Uniform1f[‘region1.max]:= 2.0;

Uniform1f[‘region1.min]:= 0.5;

Следующие команды в таблицах — перевод стандартной спецификации GLSL 1.50 (http://www.opengl.org/registry/doc/GLSLangSpec.1.50.09.pdf). Из-за муторности перевода здесь представлены не все таблицы. Табличный материал в этой подглаве приведён для справки, запоминать такой объём мы не советуем.

Угловые и тригонометрические функции

 

Синтаксис Описание
genType radians (genType degrees) Переводит градусы в радианы.
genType degrees (genType radians) Переводит радианы в градусы.
genType sin (genType angle) Возвращает синус.
genType cos (genType angle) Возвращает косинус.
genType tan (genType angle) Возвращает тангенс.
genType asin (genType x) Арксинус. Возвращает угол, синус которого равен x. Значения, возвращаемые этой функцией, лежат в [–π/2; π/2]. Результат не определён, если |x|>1.
genType acos (genType x) Арксинус. Возвращает угол, косинус которого равен x. Значения, возвращаемые этой функцией, лежат в [0; π]. Результат не определён, если |x|>1.
genType atan (genType y, genType x) Арктангенс. Возвращает угол, тангенс которого равен y / x. Знак x и y используется для определения четверти окружности круга (квадранта). Значения, возвращаемые этой функцией, лежат в [–π; π]. Результат не определён, если x=y=0.
genType sinh (genType x) Возвращает гиперболический синус
genType cosh (genType x) Возвращает гиперболический косинус функции
genType tanh (genType x) Возвращает гиперболический тангенс функции
genType asinh (genType x) Аркгиперболический синус; возвращает x из его sinh.
genType acosh (genType x) Аркгиперболический косинус; возвращает неотрицательное обратное значение из его cosh. Результат не определён, если х<1.
genType atanh (genType x) Аркгиперболический тангенс; возвращает обратное из tanh. Результат не определён, если |x|≥1.

Общие функции

 

Синтаксис Описание
genType abs (genType x) genIType abs (genIType x) Возвращает модуль
genType sign (genType x) genIType sign (genIType x) Возвращает 1,0 если x>0; 0.0 если x=0; -1,0 если х<0.
genType floor (genType x) Возвращает значение до ближайшего целого числа, которое меньше больше или равно x.
genType trunc (genType x) Возвращает ближайшее целое к числу х, абсолютное значение которого не больше, чем абсолютное значение x.
genType round (genType x) Возвращает значение до ближайшего целого числа x. 0.5 будет округлено в направлении, выбранном на этапе объявления, возможно в направлении быстрейшего округления; в результате, возможно, что функция round(x) вернет значение, аналогичное функции roundEven(x).
genType roundEven (genType x) Округляет до ближайшего целого числа таким образом, что даже если x=3.5 или x=4.5, то будет возвращено 4.0.
genType ceil (genType x) Возвращает ближайшее целое число, которое >= x
genType fract (genType x) Возвращает x - floor (x).
genType mod (genType x, float y) genType mod (genType x, genType y) Возвращает x - Y * floor (x / y).
genType modf (genType x, out genType i) Возвращает дробную часть x и устанавливает i в целую часть. Оба они будут иметь тот же знак, что и x.
genType min (genType x, genType y) genType min (genType x, float y) genIType min (genIType x, genIType y) genIType min (genIType x, int y) genUType min (genUType x, genUType y) genUType min (genUType x, uint y) Возвращает y, если y<x, в противном случае возвращает x.  
genType max (genType x, genType y) genType max (genType x, float y) genIType max (genIType x, genIType y) genIType max (genIType x, int y) genUType max (genUType x, genUType y) genUType max (genUType x, uint y) Возвращает y, если x<y, в противном случае возвращается x.
genType clamp (genType x, genType minVal, genType maxVal) genType clamp (genType x, float minVal, float maxVal) genIType clamp (genIType x, genIType minVal, genIType maxVal) genIType clamp (genIType x, int minVal, int maxVal) genUType clamp (genUType x, genUType minVal, genUType maxVal) genUType clamp (genUType x, uint minVal, uint maxVal) Возвращает min (max (x, minVal), MAXVAL). Результат неопределён, если minVal> MAXVAL.

Геометрические функции

 

Синтаксис Описание
float length (genType x) Возвращает длину вектора x
float distance (genType p0, genType p1) Возвращает расстояние между p0 и p1, т.е. длину (p0 - p1)
float dot (genType x, genType y) Возвращает скалярное произведение (конкретное число) векторов x и y
vec3 cross (vec3 x, vec3 y) Возвращает векторное произведение x и y, т.е.
genType normalize (genType x) Возвращает вектор с тем же направлением, но с длиной 1.
compatibility profile only vec4 ftransform() Доступно только при использовании профиля совместимости. В остальных случаях используйте invariant. Только для вершинного шейдера. Эта функция гарантирует, что входящие значения вершин будут преобразованы таким образом, что их использование производит такой же результат, как и при фиксированном конвейере OpenGL. Функцию предполагается использовать для вычисления gl_Position. Например: gl_Position = ftransform() Эта функция должна быть использована, например, когда приложение визуализирует некую геометрию в отдельном процессе, и первый проход использует способы фиксированной функциональности для рендеринга, а второй проход использует программируемые шейдеры
genType faceforward(genType N, genType I, genType Nref) Если dot(Nref, I) < 0, возвращается N, если нет, то —N.
genType reflect (genType I, genType N) Возвращает направления отраженного луча при направлении падающего луча I и нормали к поверхности N: I - 2 * dot(N, I) * N N уже должно быть нормализирован.
genType refract(genType I, genType N, float eta) То же, но с учетом коэффициента преломления eta. Результат вычисляется так: k = 1.0 - eta * eta * (1.0 - dot(N, I) * dot(N, I)) if (k < 0.0) return genType(0.0) else return eta * I - (eta * dot(N, I) + sqrt(k)) * N Входные параметры I и N уже должны быть нормализованы, чтобы получить приемлемый результат.


Поделиться:


Последнее изменение этой страницы: 2016-04-19; просмотров: 423; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.190.217.167 (0.006 с.)