Следующая схема показывает необходимые для подготовки и запуска программы шейдера шаги:

Первый шаг — создание обьекта — контейнера программы.

Синтаксис OpenGL 2.0:

GLuint glCreateProgram(void);

 

Синтаксис расширений ARB:

GLhandleARB glCreateProgramObjectARB(void);

 

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

Следующий шаг присоединяет шейдеры, которые вы создали в прошлом уроке, к программе, которую вы создали только что. Сейчас шейдеры ещё не то что не скомпилированы, нет ещё даже их исходного кода. Всё это нужно присоединить к текущей программе — контейнеру шейдера.

Синтаксис 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», будет активирован фиксированный функционал.