Оператор последовательности (.) применяется для разделения выражений и возвращает тип и значение самого правого выражения из списка выражений, разделенных этим оператором. Все выражения вычисляются слева направо.
3.8. Препроцессор
Препроцессор языка шейдеров OpenGL похож на препроцессор языка С. Он поддерживает директивы #def i ne, #undef, #i f, #i fdef, #i fndef, #el se, #el i f, #endi f и #def i ned.
Эти директивы имеют такое же значение, как и в языке С. Также поддерживаются макросы с аргументами и макрорасширения. Встроенными макросами яв3.9. Выражения препроцессора лямтся_LINE_,_FILE_,_VERSION_. Вместо_LINE_подетавляется десятичная целая константа, на единицу большая количества символов перевода строки, предшествующих текущей строке исходного текста программы.
Вместо_FILE_подставляется десятичная целая константа, обозначающая номер строки исходного кода.
Вместо_VERSION_подставляется десятичное число, обозначающее номер версии языка шейдеров OpenGL. Версия языка шейдеров, описанная в этом документе, будет иметь значение_VERSION_100.
Поддерживаются также директивы #еггог message, #1 i ne и #pragma.
Директива #еггог помещает message в информационный лог шейдера. Компилятор обрабатывает это сообщение как найденную ошибку.
Действие директивы #pragma зависит от реализации. Если реализация не распознает идущие подряд лексемы, эта директива игнорируется. Однако эти директивы являются переносимыми.
Чтобы включить или выключить оптимизацию, можно использовать следующие директивы: #pragma optimize (on), #pragma optimize (off).
Оптимизация обычно выключается для отладки шейдеров. Эту директиву можно указывать только вне определения функций. По умолчанию для всех шейдеров оптимизация включена.
Опция отладки этой директивы при компиляции добавляет в шейдер отладочную информацию, которую можно использовать в отладчике: #pragroa debug(on), Ipragitia debugCof f ). Эту директиву можно указывать только вне определения функций. По умолчанию отладочная информация не добавляется.
Директива #1 i ne после макроподстановки выглядит примерно так: #1 i ne строка, #11 ne строка номер__строки_исходиого__кода, где «строка» и «номер_стро-ки_исходного_кода» - константные целые выражения. После обработки этой директивы реализация будет считать, что компиляция происходит на строке «строка + 1», а номер строки исходного кода - это «номер_строки_исходного_кода», и такая нумерация сохранится до следующей директивы #1 i ne.