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.

Еще одно существенное отличие состоит в том, что все входные и выходные параметры функций передаются по значению, а не по указателю, как это возможно в С.


⇐ вернуться назад | | далее ⇒