Следующая схема показывает необходимые для подготовки и запуска программы шейдера шаги:
Первый шаг — создание обьекта — контейнера программы.
Синтаксис OpenGL 2.0:
Синтаксис расширений ARB:
Одновременно вы можете создавать столько программ-шейдеров, сколько хотите. Отрендерив то, что вам нужно, вы можете запустить другую программу, или даже вернутся к фиксированному функционалу. Например, вы можете захотеть отрендерить чайник с шейдерами отражения и преломления, а текстурную карту на бекграунде нарисовать с фиксированным функционалом.
Следующий шаг присоединяет шейдеры, которые вы создали в прошлом уроке, к программе, которую вы создали только что. Сейчас шейдеры ещё не то что не скомпилированы, нет ещё даже их исходного кода. Всё это нужно присоединить к текущей программе — контейнеру шейдера.
Синтаксис OpenGL 2.0 для добавления шейдера в программу:
void glAttachShader(GLuint program, GLuint shader);
// Параметры:
// program — дескриптор программы
// shader — дескриптор шейдера, который вы присоединяете
Синтаксис расширений ARB для добавления шейдера в программу:
void glAttachObjectARB(GLhandleARB program, GLhandleARB shader);
// Параметры:
// program — дескриптор программы
// shader — дескриптор шейдера, который вы присоединяете
Если у вас есть два вершинных/пикселных шейдера, вам нужно присоединить к программе оба. У вас может быть много шейдеров любого типа, присоединенных к программе, точно как в программе на C может быть множество модулей. Но для каждого типа шейдеров в коде только ОДНОГО шейдера может быть функция main(), точно так же, как в программе на C.
Вы можете добавлять шейдеры к нескольким программам, например если вы планируете использовать вершинный шейдер в разных программах.
Следующий шаг — прилинковать программу. К этому моменту шейдеры должны быть уже скомпилированы, как показано в предыдущем разделе.
Синтаксис функции линкования шейдера для OpenGL 2.0:
void glLinkProgram(GLuint program);
// Где program — дескриптор программы.
Синтаксис функции линкования шейдера для расширений ARB:
void glLinkProgramARB(GLhandleARB program);
// Где program — дескриптор программы.
После операции линковки исходный код шейдера может быть изменён и шейдер может быть перекомпилирован без затрагивания программы.
Как показано на схеме вверху, после линковки программы идёт функция для загрузки и использования шейдера. Каждая программа хранится как дескриптор, и вы можете иметь столько программ/шейдеров, прилинкованных и готовых к употреблению, сколько хотите (или сколько позволит ваше железо).
Синтаксис OpenGL 2.0:
void glUseProgram(GLuint prog);
// Где prog — дескриптор программы.
Синтаксис расширений ARB:
void glUseProgramObjectARB(GLhandleARB prog);
// Где prog — дескриптор программы.
Если программа используется и будет снова прилинкована, нет необходимости заново вызывать эту функцию.
Если передать вместо «prog» «0», будет активирован фиксированный функционал.