В языке шейдеров нет эквивалента ключевому слову goto и нет аналогов меток. Выбор оператором swi tcb одного из нескольких вариантов также отсутствует,
3.6.1. Функции
Работа с функциями в языке шейдеров OpenGL построена почти так же, как в C++. Функции можно перегружать по количеству и типу входных параметров, но не исключительно по возвращаемому типу. Либо тело функции, либо ее объявление должны находиться в области видимости перед вызовом функции. Типы параметров всегда проверяются. Это значит, что пустой список параметров О в объявлении функции однозначный - отсутствие аргументов. Типы передаваемых значений должны совпадать с объявленными параметрами, так как не происходит неявного преобразования типов. При перегрузке выбор нужной функции очень прост.
Выход из функции с помощью оператора return происходит так же, как и в C++. Функции, которые что-то возвращают, должны возвращать значение, совпадающее по типу с объявленным.
Нельзя вызвать функцию рекурсивно ни явно, ни косвенно.
3.6.2. Соглашение о вызовах
В языке шейдеров OpenGL параметры передаются в функцию по значению. Такие вызовы знакомы по языку С: входные параметры при вызове функции будут копироваться, а не передаваться по ссылке. Так как в языке нет указателей, не следует беспокоиться о том, что функция нечаянно изменит какие-либо параметры, не предназначенные для этого, которые являются ссылками на внешние области данных. Если какие-либо параметры изменяются и их нужно передать обратно, по выходе из функции они также будут скопированы.
Чтобы определить, когда какие параметры будут копироваться, нужно указать для них соответствующие спецификаторы: in, out или inout. Если нужно, чтобы параметры копировались в функцию только перед ее выполнением, используется in. Это спецификатор по умолчанию, и он будет выставлен автоматически, если для параметра спецификатор не указан вообще. Если нужно, чтобы параметры копировались только при выходе из функции, используется спецификатор out. Чтобы копирование происходило и перед выполнением, и перед возвратом, указывается спецификатор inout:
□ in - копирует при входе, но не копирует при выходе; внутри функции можно делать запись;
□ out - копирует только при выходе; функция может читать из него, но при входе в функцию значение параметра не определено;
□ i nout - копирует и при входе, и при выходе.
К параметрам функции можно применять и спецификатор const. Это значит, что функция не может изменять передаваемый параметр. Кстати, обычный in-параметр функция изменять может, он просто не копируется при возврате обратно. Так что есть разница между параметром, объявленным как const in, и параметром, объявленным просто in или вовсе без спецификатора. Конечно, out-и inout-параметры не могут быть объявлены как const.
Приведем несколько примеров:
void ComputeCoord( in vec3 normal. II Параметр 'normal' копируется вначале,
// в него можно записывать, но он // не копируется при выходе. vec3 tangent. II Точно так же, как 'normal'