На этапе компоновки разрешены внешние ссылки между шейдерами, проверяется совместимость вершинного и фрагментного шейдеров, выделяется память для uniform-переменных и т. д. В результате получается одна или несколько выполняемых программ, которые могут быть инсталлированы как часть текущего состояния OpenGL функцией gl UseProgramObjectARB. Эта команда загружает исполняемые программы как в вершинный, так и во фрагментный процессор, где они используются для рендеринга всех последующих графических примитивов.

2.5.2. Компилятор и компоновщик языка шейдеров OpenGL

Исходный код шейдера - это массив строк, состоящих из символов. Каждая символьная строка может состоять из нескольких обычных строк, разделенных символом-признаком новой строки. Впрочем, в символьной строке вполне может не быть ни одного такого признака новой строки, а одна обычная строка может быть сформирована из нескольких символьных - когда OpenGL соединяет символьные строки в шейдер, он не вставляет никаких дополнительных символов. Только от разработчика зависит, будет ли исходный код шейдера содержать символы перевода строки между предложениями.

Сообщения об ошибках и предупреждения, которые появляются после компиляции шейдера, должны указывать и номер обычной строки в символьной строке, и символьную строку, в которой появились ошибка или предупреждение. Нумерация строк последовательная и начинается с 0. При грамматическом анализе кода номер текущей строки на единицу больше, чем количество уже обработанных строк.

Препроцессор компилятора языка шейдеров OpenGL выпущен компанией 3Dlabs как программный продукт с открытым исходным текстом, и кто угодно может использовать его для написания собственного компилятора. Этот препроцессор может выполнять лексический разбор исходного кода языка шейдеров OpenGL, выдавая последовательность лексем, а затем выполнять синтаксический и семантический анализ лексем для создания двоичного высокоуровневого представления языка.

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

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


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