3.9. Выражения препроцессора Выражения препроцессора могут содержать операторы (табл. 3.2).
Таблица 3.2. Операторы препроцессора Оператор
Описание
+ -
+ - ~ !
*/%
« >>
Унарные Мультипликативные Аддитивные Побитовый сдвиг
&^ I && II
<><=>:
Отношения Равенства Побитовые Логические
Определение языка
Приоритет и значения операторов такие же, как в обычном препроцессоре языка С.
Важно понимать, что выражения препроцессора будут вычисляться не на графическом процессоре, который выполняет шейдер, а на процессоре, на котором выполняется компилятор. Поэтому точность вычислений будет соответствовать точности главного процессора и отличаться от точности, обеспечиваемой языком шейдеров OpenGL.
Строковые типы и операции не поддерживаются, как и операторы #, ##, оператор sizeof и т. д.
3.10. Обработка ошибок Иногда компиляторы не замечают некоторых ошибок, так как невозможно их все отследить. Например, невозможен полный контроль над попытками использования неинициализированной переменной. Шейдеры, которые содержат такие ошибки, могут по-разному выполняться на разных платформах. Поэтому спецификация языка шейдеров OpenGL гарантирует переносимость только для правильных программ.
Компиляторы языка шейдеров OpenGL должны выявлять неправильные программы и выдавать диагностические сообщения, но спецификация не требует делать это во всех случаях. Компиляторы должны выдавать сообщения, если шейдеры содержат лексические, грамматические или семантические ошибки. Такие шейдеры вообще не могут выполняться. Способы получения диагностических сообщений обсуждаются в разделе 7.5.
3.11. Итоги Язык шейдеров OpenGL - процедурный язык высокого уровня, созданный специально для работы в среде OpenGL. Этот язык позволяет приложениям программировать обработку некоторых операций, выполняющихся параллельно на графическом аппаратном обеспечении. Язык содержит конструкции, позволяющие писать лаконичные выражения для графических алгоритмов, удобные для программистов, привыкших работать на языках С и С++.