Определение языка
для параметра спецификатор не указан вообще. Если нужно, чтобы параметры копировались только при выходе из функции, используется спецификатор out. Чтобы копирование происходило и перед выполнением, и перед возвратом, указывается спецификатор inout:
□ in - копирует при входе, но не копирует при выходе; внутри функции можно делать запись;
□ out - копирует только при выходе; функция может читать из него, но при входе в функцию значение параметра не определено;
□ i nout - копирует и при входе, и при выходе.
К параметрам функции можно применять и спецификатор const. Это значит, что функция не может изменять передаваемый параметр. Кстати, обычный in-параметр функция изменять может, он просто не копируется при возврате обратно. Так что есть разница между параметром, объявленным как const in, и параметром, объявленным просто m или вовсе без спецификатора. Конечно, out-и inout-параметры не могут быть объявлены как const.
Приведем несколько примеров:
void ComputeCoofdC in vec3 normal. // Параметр 'normal' копируется вначале.
// в него можно записывать, но он // не копируется при выходе. vec3 tangent. // Точно так же. как 'normal'
inout vec3 coord) ^ // Копируется при входе и при выходе.
Или
vec3 ComputeCoord( const vec3 normal. // нельзя записывать в normal vec3 tangent.
in vec3 coord) // функция вернет результат
Следующие объявления некорректны:
void ComputeCoordCconst out vec3 normal. // нельзя записывать в normal const inout vec3 tang. // нельзя записывать 8 tang
in out vec3 coord) // неверно: следует использовать
//inout
Функции возвращают либо какое-то значение, либо ничего. Если функция ничего не возвращает, ее надо объявлять как voi d. Если функция возвращает значение, оно может быть любого типа, кроме массива, хотя и массивы могут возвращаться в составе структур.
3.6.3. Встроенные функции В языке шейдеров OpenGL доступен обширный набор встроенных функций. Они подробно описаны в главе 5.
Шейдер может переопределить любую из этих функций. Чтобы переопределить функцию, нужно объявить ее прототип или определение в области видимости шейдера. При этом компилятор или компоновщик, встретив вызов этой функции, будет искать определенную шейдером реализацию, чтобы переадресовать вызов туда. Например, одна из встроенных тригонометрических функций объявлена как