□ Можно систематизировать некоторые общие части исходного кода,
□ Можно использовать совместно для нескольких шейдеров какой-либо «заголовочный» код (подобно заголовочным файлам в C++).
□ Можно совместно использовать значения #defi пе для контроля процесса компиляции.
□ Можно включать в код функции, определенные разработчиком или взятые из других библиотек.
7.2. Компиляция шейдерных объектов
После загрузки исходного кода шейдера в шейдерный объект этот исходный код необходимо скомпилировать, чтобы проверить его. Результат компиляции тоже хранится в шейдерном объекте до тех пор, пока не будет выполнена следующая компиляция либо объект не будет удален. Для компиляции шейдерного объекта используется команда
void glCompileShaderAREKGLhandleARB shader)
Команда компилирует исходный код, хранящийся в объекте. Результат компиляции будет сохранен как часть состояния шейдерного объекта. Это значение будет установлено в GL_TRUE, если не допущено никаких ошибок компиляции, и в GL_FALSE, если ошибки были. Это можно узнать с помощью функции glGet-ObjectParameterARB с аргументами s/istferHGL_OBJECT_COMPILE_STATLIS_ARB, Шейдер не сможет быть скомпилирован, если его исходный код неправилен лексически, грамматически или семантически. Независимо от того, была компиляция успешной или нет, информацию о ней можно получить из протокола шейдерного объекта функцией gl GetlnfoLogARB.
У языка шейдеров OpenGL есть свои правила компиляции, которые немного различаются в зависимости от типа компилируемого шейдера, так что во время компиляции учитывается, является шейдер вершинным или фрагментным.
Информацию о прохождении этой операции можно получить с помощью функции gl GetlnfoLogARB (см. раздел 7.5) с параметром shader, но не нужно использовать ее как показатель успешности или неуспешности компиляции. Если компиляция прошла успешно, эта функция вогшпятит либо пустую строку, либо информацию об операции компиляции. Если же компиляция шейдерного объекта прошла с ошибками, информационный лог будет содержать сообщения о любых лексических, грамматических или семантических ошибках, а также предупреждения и другую информацию от компилятора.
Функция gl Compi 1 eShaderARB возвращает контроль приложению, не ожидая окончания компиляции. Все последующие команды, которые влияют на завершение компиляции (например, gl Li rikPrograhiARB), блокируются до ее завершения. Для того чтобы убедиться, что компиляция прошла успешно, нужно запросить результат компиляции, воспользовавшись функцией glGetObjectParameterARB. Эта функция будет ожидать окончания компиляции исходного кода и момента, когда статуе результата станет доступным.
.3. Компоновка и использование шейдеров
Каждый шейдерный объект компилируется отдельно. Чтобы создать программу, нужен механизм для определения списка шейдерных объектов, которые должны быть скомпонованы в одну программу. Это делается созданием программного объекта и присоединением к нему всех шейдерных объектов для данной программы.