GLint linked:
// Создание вершинного и фрагментного шейдерных объектов
brickVS - glCreateShaderObjectARBCGL VERTEX5HADER ARB): brickFS = glCreateShaderObjectARB(GL>RAGMENTJHADER_ARB):
// Загрузка исходного кода шейдеров s шейдерные объекты
glShaderSourceARBtbnckVS. 1. torickVertex. NULL) : glShaderSourceARBCbrickFS. 1. SbrickFragment. MULL);
// Компиляция вершинного шейдера кирпичной стены // и вывод на экран информационного журнала
glCompi1eShaderARB(brickVS);
printOpenGLErrprO : // проверка на ошибки OpenGL
glGetObjectParameterivARBCbnckVS.
GL_OBJECT_COMPILE_STATUS_ARB, ÄvertCompiled): printlnfoLog(brickVS):
II Компиляция фрагментного шейдера кирпичной стены II и вывод на экран информационного журнала
glCompileShaderARB(bnckFS) :
printOpenGLErrorO : // проверка на ошибки OpenGL
glGetObjectParameterivARB(brickFS.
GL_OBJECT_COMPILE_STATUS_ARB. SfragCompi1ed): printlnfoLog(brickFS):
if (!vertCompiled || IfragCompiled) return 0:
// Создание программного объекта
//и присоединение к нему шейдерных объектов
brickProg = glCreateProgramObjectARBC):
продолжение &
API языка шейдеров OpenGL
Листинг 7.2 (продолжение)
glAttachObjectARB(brickProg. brickVS): gl AttachObjectARBtbrickProg. brickFS);
// Компоновка программного объекта
//и вывод на экран информационного журнала
gl Li nkPrograinARB(bri ckProg):
printOpenGLErrorO: // проверка на ошибки OpenGL
glGetObjectParameterivARBCbrickProg.
GL OBJECT_LINK_STATUS_ARB, &1inked): printlnfoLogCbrickPr.og):
if (!Hnked) return 0:
// Установка программного объекта как текущего
gl UsePrograrnObjectARBCbri ckProg):
// Установка начальных значений uniform-переменных
glUniform3fARB(getUniLoc(brickProg. "BrickColor"). 1.0. 0.3. 0.2):
glUnifonri3fARB(getUniLoc(brickProg, "MortarColor"). 0.85. 0.86. 0.84):
glUniform2fARB(getUniLoc(bnckProg. "BrickSize"). 0.30. 0.15):
glUniform2fARB(getUniLoc(brickProg, "BrickPct").. 0.90. 0.85):
glLiniform3fARB(getUnlLoc(br1ckProg, "LightPosition"). 0.0, 0.0. 4.0):