brickProg = glCreateProgramObjectARBO: glAttachObjectARB(brickProg. brickVS): glAttachObjectARBCbrickProg. brickFS);

Компоновать программный объект нужно функцией gl Li nkProgramARB. Информационный журнал программного объекта снова выводится вне зависимости от результатов компоновки. При первом запуске шейдера можно получить из него полезную информацию:

glLinkProgramARBf bri ckProg);

printOpenGLError( ) : // проверка на ошибки OpenGL

glGetObiectParameterivAKB(brickProg.
GL_0BJECT_LINKSTATQS_ARB, SI inked): printlnfoLog(brlckProg) :
if fllinked) return 0:

Программа создана и может быть установлена в качестве текущей функцией glUseProgramObjectARB:

glUseProgramObjectARBCbrickProg) :

Перед выходом из функции 1 nstal 1 Bri ckShaders неплохо было бы инициализировать uniform-переменные для обоих шейдеров. Чтобы получить адрес переменной после компоновки, каждая переменная запрашивается по имени с помощью определенной ранее функции getUni Loc. Этот адрес сразу используется для установки начального значения uniform-переменной:

glUniform3fARB(getUniLoc(brickProg. "BrickColor"). 1.0. 0.3. 0.2): glUniform3fARB(getUniLoc(brickProg. "MortarColor"). 0.85. 0.86. 0.84):

Ш, Код приложения для шейдеров кирпичной стены

gl Un i f о rm2f ARS ( getUn 1 Loc ( b г i ck P год. "Brick-Size"). 0.30. 0.15): glUniform2fARB(getUniLoc(brickProg. "BrickPct"). 0.90. 0.S5):. glUniform3fARB(getUniLoc(bhckProg. "Lightposition"), 0.0. 0.0. 4.0): return 1: После возврата из функции приложение может рисовать геометрические фигуры, и установленные шейдеры будут выполнять их рендеринг. Результат применения к некоторым простым объектам шейдеров, описанных в главе 6, и кода программы показан на рис. 6.4. Функция на языке С приведена полностью в листинге 7.2.

Листинг 7.2. Функция на языке С для установки шейдеров кирпичной стены

int InstallBrickShadersfGLcharARB *brickvertex. GLcnarARB *brickFragment)
{

GLhandleARB brickVS. brickFS. brickProg: // идентификаторы объектов GLint vertCompiled. fragCompiled: // статусы


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