2.4.4. Дополнения из С+ +
Язык шейдеров OpenGL заимствовал несколько необходимых возможностей из C++. Например, в нем поддерживается перегрузка функций, которая облегчает определение функций, различающихся только типом передаваемых аргументов. Многие встроенные функции языка шейдеров OpenGL перегружены. Например, функция для вычисления скалярного произведения перегружена для типов f 1 oat, vec2, vec3 и vec4. Идея конструкторов тоже пришла из C++. Инициализировать данные в языке шейдеров OpenGL одним или несколькими способами можно только с помощью конструкторов.
Другая возможность, позаимствованная из C++, - то, что переменные могут быть объявлены непосредственно там, где они будут использоваться, а не в начале блока. Поддерживается тип bool. Функции должны быть объявлены перед использованием: либо определением (телом функции), либо прототипом.
2.4.5. Не поддерживаемые возможности С
В отличие от ANSI С в языке шейдеров OpenGL нет неявного приведения типов. Если в выражении будут использованы переменные различных типов, компилятор воспримет это как ошибку. Например, выражение float f = 0; ошибочна, a f 1 oat f = 0.0: - правильно. Это может показаться неудобным, зато упрощает язык, так как не нужно задавать и проверять правила приведения типов. Это также избавляет язык от неоднозначности при вызове функции, перегруженной по типу аргументов.
Язык шейдеров OpenGL не поддерживает указатели, строки или символы и любые операции с ними. Это язык для работы с числовыми, а не строковыми данными, и нет смысла усложнять его. Не поддерживаются здесь и числа с плавающей занятой двойной точности, а также короткие и длинные целые, беззнаковые - чтобы не обременять компилятор и графический ускоритель.
Для упрощения языка шейдеров OpenGL в нем отсутствуют также union, enum, битовые поля и побитовые операторы. Так как язык не файловый, не будет никаких директив #i ncl ude или других ссылок на имена файлов.
2.4.6. Другие отличия
В некоторых случаях язык шейдеров OpenGL предоставляет ту же функциональность, что и язык С, но действия выполняются по-другому. Например, конструкторы, а не операторы приведения используются для приведения типов; конструкторы, а не инициализация в стиле С используются для инициализации переменных. В языке не существует неявного приведения типов, и конструкторы помогают сохранять типовую безопасность языка. В конструкторах сохраняется синтаксис вызова функции, где имя функции - это название нужного типа и аргументы - значения, используемые для инициализации.
Конструкторы предоставляют гораздо более богатый выбор операций, чем простое приведение типов или инициализация в стиле С, и эта гибкость делает еще более удобной работу с векторными и матричными типами данных. Например, конструктор vec3( 1.0. 2.0. 3.0) создает переменную типа vec3 из трех скалярных значений, а конструктор vec3(myVec4) отбрасывает четвертый компонент из myVec4, чтобы создать значение типа vec3.
Еще одно существенное отличие состоит в том, что все входные и выходные параметры функций передаются по значению, а не по указателю, как это возможно в С.