Введение в программирование трехмерных игр с DX9

       

Встроенные функции


В HLSL есть богатый набор встроенных функций, часто используемых для трехмерной графики. Ниже приведена таблица с сокращенным списком этих функций. В следующих двух главах мы попрактикуемся в применении некоторых из них. А сейчас давайте просто познакомимся с этими функциями.

ПРИМЕЧАНИЕ

Если в дальнейшем вам понадобится более подробная информация, полный список встроенных функций HLSL вы найдете в документации DirectX, перейдя на вкладку Contents и выбрав пункт DirectX Graphics\Reference\Shader Reference\High Level Shader Language\Intrinsic Functions.



Функция Описание
abs(x) Возвращает |x|.
ceil(x) Возвращает наименьшее целое, которое больше или равно x.
clamp(x, a, b) Ограничивает x в диапазоне [a, b] и возвращает результат. Если x меньше a возвращается a, если x больше b, возвращается b, в остальных случаях возвращается x.
cos(x) Возвращает косинус x, x — в радианах.
cross(u, v) Возвращает u × v.
degrees(x) Преобразует x из радиан в градусы.
determinant(M) Возвращает детерминант матрицы det(M).
distance(u, v) Возвращает расстояние |v – u| между точкам u и v.
dot(u, v) Возвращает u Ч v.
floor(x) Возвращает наибольшее целое, которое меньше или равно x.
length(v) Возвращает |v|.
lerp(u, v, t) Линейная интерполяция между u и v на основании параметра t, находящегося в диапазоне [0, 1].
log(x) Возвращает ln(x).
log10(x) Возвращает log10(x).
log2(x) Возвращает log2(x).
max(x, y) Возвращает x если x ≥ y, иначе возвращает y.
min(x, y) Возвращает x если x ≤ y, иначе возвращает y.
mul(M, N) Возвращает произведение матриц MN. Обратите внимание, что произведение матриц MN должно быть определено. Если M это вектор, он используется как вектор-строка, чтобы было определено произведение вектора на матрицу. Точно так же, если N это вектор, то он используется как вектор-столбец, чтобы было определено произведение матрицы на вектор.
normalize(v) Возвращает v/|v|.
pow(b, n) Возвращает bn.
radians(x) Преобразует x из градусов в радианы.
reflect(v, n) Вычисляет вектор отражения по исходному вектору v и нормали поверхности n.
refract(v, n, eta) Вычисляет вектор преломления по исходному вектору v, нормали поверхности n и отношению коэффициентов преломления двух материалов eta. Чтобы получить дополнительные сведения о преломлении, посмотрите закон Снеллиуса в учебнике физики.
rsqrt(x) Возвращает 1/√x.
saturate(x) Возвращает clamp(x, 0.0, 1.0).
sin(x) Возвращает синус x, x в радианах.
sincos(in x, out s, out c) Возвращает синус и косинус x, x в радианах.
sqrt(x) Возвращает √x.
tan(x) Возвращает тангенс x, x в радианах.
transpose(M) Возвращает транспонированную матрицу MT.
< Большинство функций имеют перегруженные версии для работы со всеми встроенными типами для которых результат работы функции имеет смысл. Например, функция abs имеет смысл для всех скалярных типов и, следовательно, имеет перегруженные версии для всех них. В то же время векторное произведение имеет смысл только для трехмерных векторов и поэтому для функции cross есть перегруженные версии для работы с трехмерными векторами любых типов (то есть векторами, компоненты которых имеют тип int, float, double и т.д.). С другой стороны, линейная интерполяция, lerp, имеет смысл для скаляров, двухмерных, трехмерных и четырехмерных векторов, и имеет перегруженные варианты для всех этих типов.

ПРИМЕЧАНИЕ

Если вы передаете вектор или матрицу в «скалярную» функцию, то есть функцию, которая обычно выполняется над скалярами (например, cos(x)), вычисления будут проводиться покомпонентно. Например, если написать:

float3 v = float3(0.0f, 0.0f, 0.0f); v = cos(v);

то функция будет применена к каждой компоненте : v = (cos(x), cos(y), cos(z)). Приведенные ниже фрагменты кода демонстрируют использование встроенных функций:

float x = sin(1.0f); // синус 1.0f радиан

float y = sqrt(4.0f); // квадратный корень из 4.

vector u = {1.0f, 2.0f, -3.0f, 0.0f}; vector v = {3.0f, -1.0f, 0.0f, 2.0f}; float s = dot(u, v); // скалярное произведение векторов u и v.

float3 i = {1.0f, 0.0f, 0.0f}; float3 j = {0.0f, 1.0f, 0.0f}; float3 k = cross(i, j); // векторное произведение векторов i и j.

matrix<float, 2, 2> M = {1.0f, 2.0f, 3.0f, 4.0f}; matrix<float, 2, 2> T = transpose(M); // транспонирование матрицы


Содержание раздела