При создании шейдерного объекта его параметр GL_OBJECT_TYPE_ARB устанавливается в GL_SHADER_OBJECT ARB, a GL_OBJECT_SUBTYPE_ARB устанавливается в значение либо GL_VERTEX_SHADER_ARB, либо в GL_FRAGMENT_SHAOER_ARB - в зависимости от значения shâderType.

После того как шейдерный объект создан, в него нужно занести строки с исходным кодом шейдера. Исходный код шейдера представлен в виде массива строк. Команда для определения исходного кода шейдера:

void glShaderSourceARBCGLhandleARB shader.
GLuirit nstrings.
const GLcharARB ** strings.
GLint * lengths)

Эта команда устанавливает исходный код шейдера из массива строк (параметр strings), полностью замещая предыдущий код в объекте. Количество строк в массиве указано в nstrings. Если параметр lengths - NULL, то предполагается, что

API языка шейдеров OpenGL

каждая строка из strings содержит завершающий символ конца строки. Если же lengths не NU LL, этот параметр указывает на массив, в котором содержатся длины соответствующих строк (не считая нуль-символа), или отрицательное значение (в этом случае соответствующая строка также заканчивается нуль-символом). На данном этапе исходный код шейдера не анализируется, а просто копируется в объект. Приложение может делать все что угодно (модифицировать свою копию исходного кода, удалять ее из strings) сразу же после возврата из этой функции.

Передача исходного кода шейдера не в одной, а в нескольких строках имеет следующие преимущества:

□ Можно систематизировать некоторые общие части исходного кода.

□ Можно использовать совместно для нескольких шейдеров какой-либо «заголовочный» код (подобно заголовочным файлам в С++).

Q Можно совместно использовать значения #def i ne для контроля процесса компиляции.

□ Можно включать в код функции, определенные разработчиком или взятые из других библиотек.

7.2. Компиляция шейдерных объектов После загрузки исходного кода шейдера в шейдерный объект этот исходный код необходимо скомпилировать, чтобы проверить его. Результат компиляции тоже хранится в шейдерном объекте до тех пор, пока не будет выполнена следующая компиляция либо объект не будет удален. Для компиляции шейдерного объекта используется команда


⇐ Предыдущая| |Следующая ⇒