}

Оба шейдера получают данные от приложения через объявленные uniform-переменные. Вершинный шейдер получает информацию о каждой вершине через attribute-переменную. Из вершинного шейдера фрагментному шейдеру информация передается через varying-переменные, объявления которых должны совпадать в обоих шейдерах. Стандартная функциональность, расположенная между вершинным и фрагментньш процессорами, интерполирует вершинные значения из varying-переменной. Фрагментный шейдер читает уже интерполированные значения из той же varying-переменной.

Шейдеры взаимодействуют со стандартной функциональностью OpenGL через встроенные переменные, которые начинаются с префикса д1_. В предыдущих примерах запись в переменную gl_Posi ti on сообщает OpenGL, где размещены преобразованные вершины, а запись в переменную gl_FragCol or обозначает цвет фрагмента.

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

3.2. Типы данных

В примерах, приведенных в предыдущем разделе, использовались векторы из чисел: с плавающей запятой. Упрощению графических алгоритмов в языке шейдеров OpenGL способствует доступность многих других встроенных типов данных: булевых, целых, матриц, векторов других типов, структур и массивов, В этом разделе будет описан каждый из типов. Бросается в глаза отсутствие строковых и символьных типов: они не используются при обработке вершин и фрагментов.

3.2.1. Скалярные типы

В языке шейдеров OpenGL доступны следующие скалярные типы:

Q float - объявляет число с плавающей запятой;

□ int - объявляет целое число;

□ bool - объявляет булеву переменную.

Эти типы используются для объявления переменных таким же способом, как в. С и C++: float f:

float g, h = 2.4: int NumTextures - 4; bool skipProcessing: В отличие от языка С здесь нужно обязательно указывать имя типа - не существует типа по умолчанию. Как и в C++, объявлять переменные можно в любой части кода, а не только после открытой фигурной скобки {.

Как и в языке С, числа с плавающей запятой здесь можно объявлять с помощью специальных символов (хотя суффиксы для обозначения точности отсутствуют, так как в языке шейдеров всего один числовой тип с плавающей запятой):

3.14159

3.

0.2

.609

1.5е10

Q.4E-4

etc, В целом операции над числами с плавающей запятой выполняются так же, как ив языке С.

Не следует ожидать, что в языке шейдеров OpenGL и операции над целыми числами будут выполняться так же, как в С, так как здесь не предъявляется требование, чтобы при вычислениях они помещались в соответствующий регистр ограниченной разрядности. Не определено, что случится с числом при переполнении или исчезновении значащих разрядов, так как этого не случается. Не поддерживаются и битовые операции - сдвиг влево («), битовое «И» (&), а также все подобные им операции.


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