glGetObjectParameterivARBtbrickFS.

GL_OBJECT_COMPILE_STATUS_ARB. fifragCorcipiled): printlnfoLog(briG.kFS):

if (IvertCompiled || IfragCompiled) return 0: Эта часть кода использует определенную ранее функцию pri nt InfoLog.

К этому моменту шейдеры уже успешно скомпилированы и почти готовы к работе. Теперь следует присоединить шейдерные объекты к программному объекту для компоновки:

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

glLinkProgramARBfbrickProg);

printOpenGLErrorO; // проверка на ошибки OpenGL

gl GetObjectParameterivARB(bri ckProg,

GL_0BJECT_LINK_STATUS_AR8, 81 inked): printlnfoLog(brickProg);

if ('linked) return 0: Программа создана и может быть установлена в качестве текущей функцией gl UseProgramObjectARS:

glUseProgramObjectARBC br i ckProg); Перед выходом из функции i nsta 11 Bri ckShaders неплохо было бы инициализировать uniform-переменные для обоих шейдеров. Чтобы получить адрес переменной после компоновки, каждая переменная запрашивается по имени с помощью определенной ранее функции get Uni Lqc. Этот адрес сразу используется для установки начального значения uniform-переменной:

gl Uniform3fARB(getUniLoc(brickProg. "BrickColor"). 1.0. 0.3. 0,2): glllniform3fARB(getllniLoc(brickProg. "MortarColor"), 0.85, 0.86. 0.84):

8lUn1form2fARB(getUniLoc(bricfcP'rog, "BricfeSize"), 0.30, 0,15) ; gl Uni form2f ARBCgetUni Lac< bri ctProg. "BrickPct"), 0.90. 0.85):. g1Uniforni3fAR8(getUniLoc(brickProg, "LightPosition"), 0.0. 0.0. 4.0); return 1: После возврата из функции приложение может рисовать геометрические фигуры, и установленные шейдеры будут выполнять их рендеринг. Результат применения к некоторым простым объектам шейдеров, описанных в главе 6, и кода программы показан на рис. 6.4. Функция на языке С приведена полностью в листинге 7.2.

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

int installBrickShadersCGLcharARB *brickVertex,

GLcharARB *brickFragment)

{

GLhandleARB brickVS, brickFS, brickProg: // идентификаторы объектов

GLint vertCompiled, fragCompiled; // статусы

GLint linked;

// Создание вершинного и фрагментного шейдерных объектов

bri ck VS = glCreateSh ade rObJectARB(GL_VERTEX_5HADER ARB): brickFS => glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB):

// Загрузка исходного кода шейдеров 8 шейдерные объекты

glSbaderSourceARB(brickVS. 1. SbrickVertex. NULL): glShaderSourceARSCbrickFS. 1, &brickFragment, MULL);

// Компиляция вершинного шейдера кирпичной стены // и вывод на экран информационного журнала

glCompileShaderARB(brickVS);

printOpenGLErrorO; // проверка на ошибки OpenGL

glGetObjectPerameterivARB{brickVS,


⇐ вернуться назад | | далее ⇒