GL_OBJЕСТ COMP1LE_STATU5_ARB, SvertCompiled); printlnfoLog(brickVS); И Компиляция фрагментного шейдера кирпичной стены // и вывод на экран информационного журнала
glCompileShaderARB(brickFS);
printOpenGLErrorO: // проверка на ошибки OpenGL
glGetObjectParameterivARB(brickFS.
GL_0BJЕСТ_С0МРILE_STATUS_ARB, SfragCompiled): printlnfoLog(brickFS):
if (!vertCompiled || IfragCompiled) return 0:
// Создание программного объекта
// и присоединение к нему шейдерных объектов
brickProg = glCreateProgramObjectARBO: продолжение & Листинг 7.2 (продолжение)
glAttachObjectARBCbrickprog. brickVS): glAttachObjectARB(brickProg. brickFS);
// Компоновка программного объекта
// и вывод на зкран информационного журнала
gl LinkProgramARB(brickProg):
printOpenGLErrorO; // проверка на ошибки OpenGL
glGetObjectParameteri vARB{brickProg.
GL J)BJECT_LINK_STATUS_ARB. &1inked); printlnfoLog(brickPr.og);
if (!linked) return 0:
// Установка программного объекта как текущего
glUseProgramObjectARBCbrickProg);
// Установка начальных значений uniform-переменных
glUniform3fARB(getLJniLoc(bric'kProg, "BrickCplor"). 1.0, 0.3. 0.2): glUniform3fARB(getUniLoc(brickProg. "MortarColor"), 0.85. 0.86, 0.84): glUnifor[n2fARB(getUniloc(brickProg. "BrickSize"). 0.30. 0.15); glUnifor(n2fARB{getUniLoc(bnckProg, "BrickPct").. 0.90. 0.85): glUnifonn3fARB(getUniLoc(bnckProg. "LightPosition"). 0.0, 0.0, 4.0) :
return 1:
}
7.12. Итоги
Набор функций для создания шейдеров и управления ими в OpenGL невелик. При создании интерфейса все было сделано для того, чтобы процесс разработки такого программного обеспечения походил на обычное программирование на С и C++. Чтобы установить OpenGL-шейдеры, необходимо выполнить следующее:
1. Создать один или несколько пустых шейдерных объектов функцией gl Create-ShaderObjectARB.
2. Передать в эти шейдеры их исходный код функцией gl ShaderSourceARB.
3. Скомпилировать каждый шейдер функцией gl Compi 1 eShaderARB.
4. Создать программный объект с помощью glCreateProgramObjectARB.
5. Присоединить шейдерные объекты к программному функцией glAttach -GbjectARB.
6. Скомпоновать программный объект функцией gl Li nkProgramARB.
7. Установить выполняемую программу в качестве текущей (активной) функцией glUseProgramObjectARB.
Адреса определенных разработчиком uniform-переменных можно получить пйсле компоновки функцией glGetUni formLocati onARB, а значения затем устанавливаются функцией gl Uni formARB.
Определенные разработчиком attribute-переменные могут быть явно связаны с каким-либо индексом дополнительных атрибутов вершин функцией gl Bi ndAtt ri b-Lpcati onARB или такое соответствие устанавливается автоматически при компоновке и может быть получено функцией gl GetAttri bLseati onARB. Значения дополнительных атрибутов вершин можно впоследствии задавать из приложения для каждой вершины отдельно одной из версий функции glVertexAttribARB или для массива йершин - функциями gl EnableVertexAttribArrayARB и gl VertexAttribPolnterARB.