Определение языка

для параметра спецификатор не указан вообще. Если нужно, чтобы параметры копировались только при выходе из функции, используется спецификатор 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.

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


⇐ Предыдущая| |Следующая ⇒