vec4 j, v;

if (anydessThantu. v)))

Присваивание (=) требует полного совпадения типов операндов. Присваивать можно любые типы, кроме массивов. Другие операторы присваивания (+=, -=, *= и /=) работают почти так же, как в С, - за одним исключением:

a*=b.a = a*b

Выражение а * b должно быть семантически правильным, и тип выражения а * b должен быть таким же, как и тип а. Другие операторы присвоения работают так же.

Тернарный оператор выбора (?:) работает с тремя операндами-выражениями (выражение!. ? выражение2 : выражениеЗ). Оператор вычисляет первое выражение, результат которого должен быть логическим значением. Если результат true, вычисляется второе выражение, в противном случае вычисляется третье выражение. Всегда вычисляется только один операнд из двух последних, либо второй либо третий, и результаты вычислений должны быть одного и того же типа - любого, кроме массива. Результат всего оператора - это результат вычисленного второго либо третьего выражения.

Оператор последовательности (,) применяется для разделения выражений и возвращает тип и значение самого правого выражения из списка выражений, разделенных этим оператором. Все выражения вычисляются слева направо.

3.8. Препроцессор

Препроцессор языка шейдеров OpenGL похож на препроцессор языка С. Он поддерживает директивы #defi ne, #undef, #i f, #i fdef, #i fndef, #el se, #el 1 f, #endi f и #defi ned.

Эти директивы имеют такое же значение, как и в языке С. Также поддерживаются макросы с аргументами и макрорасширения. Встроенными макросами явгшются_LINE_,_FILE_,_VERSION_. Вместо_LINE_подставляется десятичная целая константа, на единицу большая количества символов перевода строки, предшествующих текущей строке исходного текста программы.

Вместо_FILE_подставляется десятичная целая константа, обозначающая ввмер строки исходного кода.

Вместо_VERSION_подставляется десятичное число, обозначающее номер вер ига языка шейдеров OpenGL. Версия языка шейдеров, описанная в этом документе, будет иметь значение_VERSION_100.

Поддерживаются также директивы #еггог message, #1 i пе и #pragma.

Директива #еггог помещает message в информационный лог шейдера. Компилятор обрабатывает это сообщение как найденную ошибку.

Действие директивы #pragma зависит от реализации. Если реализация не распознает идущие подряд лексемы, эта директива игнорируется. Однако эти директивы являются переносимыми.

Чтобы включить или выключить оптимизацию, можно использовать следующие директивы: #pragma optimize С on).', #pragma optimize (off).

Оптимизация обычно выключается для отладки шейдеров. Эту директиву можно указывать только вне определения функций. По умолчанию для всех шейдеров оптимизация включена.

Опция отладки этой директивы при компиляции добавляет в шейдер отладочную информацию, которую можно использовать в отладчике: #pragma debug(on), Ipragina debug Cof f). Эту директиву можно указывать только вне определения функций. По умолчанию отладочная информация не добавляется.

Директива #1 i пе после макроподстановки выглядит примерно так: #1 i пе строка, #11 пе строка номер_строки_исходиого_кода, где «строка» и «номер_стро-ки_исход[1ого _1сода» - константные целые выражения. После обработки этой директивы реализация будет считать, что компиляция происходит на строке «строка + 1», а номер строки исходного кода - это «номер_строгш_ исходного кода», и такая нумерация сохранится до следующей директивы #1 i пе.


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