7,1. Создание шейдерных объектов
АР! языка шейдеров OpenGL сконструировано так, чтобы использование последнего походило на работу с языками С и C++: первый этап - создание исходного кода, потом его компиляция и компоновка отдельных модулей и, наконец, выполнение кода.
Чтобы поддерживать принцип высокоуровневости языка шейдеров OpenGL, нужно обеспечить создание хранилища для исходного кода, скомпилированного и выполняемого кода. Решение проблемы - определение двух новых структур данных (объектов) в OpenGL. В этих объектах могут храниться данные, и операции над объектами (для задания исходного кода, компиляции, компоновки и выполнения) уже определены. При создании объекта OpenGL возвращает его идентификатор, который затем используется для выполнения операций над объектом, установки или считывания параметров объекта.
Сначала нужно создать шейдерный объект. При этом создается структура данных, управляемая OpenGL, которая затем используется для хранения исходного кода шейдера. Шейдер создается функцией
GLhandleARB glCreateShaderObjectARBCGLenum shaderType)
Эта функция создает пустой шейдерный объект и возвращает его идентификатор. Шейдерный объект используется для хранения строк исходного кода шейдера. shaderType определяет тип создаваемого шейдера. В данный момент поддерживаются два типа шейдеров. Шейдер типа GL_VERTEX_SHAQER_ARB предназначен для запуска на программируемом вершинном процессоре, его выполнение заменяет стандартную обработку вершин в OpenGL. Шейдер типа GL_FRAGMENT_SHADER_AKB предназначен для запуска на программируемом фрагментном процессоре, его выполнение заменяет стандартную обработку фрагментов в OpenGL.
При создании шейдерного объекта его параметр GL_OBJECT_TYPE_ARB устанавливается в GL_SHADER_OBJECT_ARB, aGL_OBJECT_SUBTYPE_ARB устанавливается в значение либо GL_VERTEX_SHAQER_ARB, либо в GL_FRAGMENT_SHADER_ARB - в зависимости от значения shaderType.
После того как шейдерный объект создан, в него нужно занести строки с исходным кодом шейдера. Исходный код шейдера представлен в виде массива строк. Команда для определения исходного кода шейдера:
void glShaderSourceARBCGLhandleARB shader.
GLuirtt nstrings.
const GLcharARB ** strings,
GLint * lengths)
Эта команда устанавливает исходный код шейдера из массива строк (параметр strings), полностью замещая предыдущий код в объекте. Количество строк в массиве указано в nstrings. Если параметр lengths - NULL, то предполагается, что каждая строка из strings содержит завершающий символ конца строки. Если же lengths не NU LL, этот параметр указывает на массив, в котором содержатся длины соответствующих строк (не считая нуль-символа), или отрицательное значение (в этом случае соответствующая строка также заканчивается нуль-символом). На данном этапе исходный код шейдера не анализируется, а просто копируется в объект. Приложение может делать все что угодно (модифицировать свою копию исходного кода, удалять ее из strings) сразу же после возврата из этой функции.
Передача исходного кода шейдера не в одной, а в нескольких строках имеет следующие преимущества;