3.9. Выражения препроцессора
Выражения препроцессора могут содержать операторы (табл. 3.2).
Таблица 3.2. Операторы препроцессора
Оператор |
Описание |
-|« - JV | |
Унарные |
*/% |
Мультипликативные |
+ - |
Аддитивные |
« >> |
Побитовый сдвиг |
<><=>= |
Отношения |
== != |
Равенства |
| |
Побитовые |
М|| |
Логические |
Приоритет и значения операторов такие же, как в обычном препроцессоре языка С.
Важно понимать, что выражения препроцессора будут вычисляться не на графическом процессоре, который выполняет шейдер, а на процессоре, на котором выполняется компилятор. Поэтому точность вычислений будет соответствовать точности главного процессора и отличаться от точности, обеспечиваемой языком шейдеров OpenGL.
Строковые типы и операции не поддерживаются, как и операторы #, #, оператор sizeof и т. д.
3.10. Обработка ошибок
Иногда компиляторы не замечают некоторых ошибок, так как невозможно их все отследить. Например, невозможен полный контроль над попытками использования неинициализированной переменной. Шейдеры, которые содержат такие ошибки, могут по-разному выполняться на разных платформах. Поэтому спецификация языка шейдеров OpenGL гарантирует переносимость только для правильных программ.
Компиляторы языка шейдеров OpenGL должны выявлять неправильные программы и выдавать диагностические сообщения, но спецификация не требует делать это во всех случаях. Компиляторы должны выдавать сообщения, если шейдеры содержат лексические, грамматические или семантические ошибки. Такие шейдеры вообще не могут выполняться. Способы получения диагностических сообщений обсуждаются в разделе 7.5.
3.11. Итоги
Язык шейдеров OpenGL - процедурный язык высокого уровня, созданный специально для работы в среде OpenGL. Этот язык позволяет приложениям программировать обработку некоторых операций, выполняющихся параллельно на графическом аппаратном обеспечении. Язык содержит конструкции, позволяющие писать лаконичные выражения для графических алгоритмов, удобные для программистов, привыкших работать на языках С и C++.
Язык шейдеров OpenGL поддерживает скалярные, векторные и матричные типы, структуры и массивы; семплеры для текстур; спецификаторы для различных типов данных; конструкторы для инициализации и преобразования типов; операторы управления потоком данных и операторы для выполнения операций над данными, как и языки С и C++.
3.12. Ссылки
Определение языка шейдеров OpenGL дается в документе [3].
Грамматика языка шейдеров OpenGL описана в приложении А данной книги. Эти два документа можно использовать для уточнения деталей языка. Дополни тельные учебники, презентации, официальные документы можно найти на вебсайте SDlabs.
Функциональность языка шейдеров OpenGL дополнена расширениями. Чтобы получить полное представление о системе поддержки языка шейдеров OpenGL, желательно прочесть спецификации для расширений и спецификацию библиотеки OpenGL. Список книг по OpenGL приведен в конце первой главы.
Язык С подробно рассматривается в распространенном справочнике [2], язык C++ - в справочнике [8]. Доступно и множество других книг по этим двум языкам,