Определяемые пользователем функции
Функции в HLSL имеют следующие особенности:
Синтаксис объявления функций такой же, как и в С++.
Параметры всегда передаются по значению.
Рекурсия не поддерживается.
Функции всегда встраиваемые (inline).
Кроме того, в HLSL добавлено несколько дополнительных ключевых слов, которые могут использоваться в объявлениях функций. Для примера, рассмотрим приведенный ниже код функции на HLSL:
bool foo(in const bool b, // Входное значение bool out int r1, // Выходное значение int inout float r2) // Входное и выходное значение float { if( b ) // Проверяем входное значение { r1 = 5; // Возвращаем значение через r1 } else { r1 = 1; // Возвращаем значение через r1 }
// Поскольку r2 объявлена с ключевым словом inout // мы можем использовать ее как входное значение // и возвращать значения через нее r2 = r2 * r2 * r2;
return true; }
Функция почти полностью аналогична коду на C++, за исключением ключевых слов in, out и inout.
in — Указывает что аргумент (конкретная переменная, которую мы передаем в параметре) должен быть скопирован в параметр перед началом выполнения функции. Не требуется явно указывать ключевое слово in, поскольку его наличие подразумевается по умолчанию. Например, следующие две записи эквивалентны:
float square(in float x) { return x * x; }
Без явного указания in:
float square(float x) { return x * x; }
out — Указывает, что при возврате из функции параметр должен быть скопирован в аргумент. Это применяется для возврата значений через параметры. Ключевое слово out необходимо потому что HLSL не поддерживает передачу по ссылке или передачу указателя. Обратите внимание, что если параметр отмечен ключевым словом out, аргумент не копируется в параметр перед началом работы функции. Другими словами, такой параметр может использоваться только для возврата значений и не может применяться для передачи значений в функцию.
void square(in float x, out float y) { y = x * x; }
Здесь мы передаем возводимое в квадрат число через параметр x, а результат вычислений возвращаем через параметр y.
inout — Данное сокращение означает, что параметр является как входным, так и выходным. Ключевое слово inout применяется в том случае, если вам надо использовать один и тот же параметр как для передачи значений в функцию, так и для возврата значений из нее.
void square(inout float x) { x = x * x; }
Здесь мы передаем возводимое в квадрат число через параметр x и через него же возвращаем вычисленное значение.