GLint getUniLocCGLhandleARB program, const GLcharARB *name)

{

GLint loc:

loc = glGetUniformLocaticnARBtprograrn. name): if (loc - -1)

printf С "Uniform-переменной с именем V'^sV не существует1^". name):

printOpenGLErrorO: // проверка на ошибки OpenGl

return loc: Шейдеры передаются в OpenGL как строки. Для создаваемой функции установки шейдера предположим, что каждый шейдер определен одной строкой и указатели на эти строки передаются в функцию. Приведем определение функции й ее локальные переменные:

int installBrick-ShadersfGLcharARB *brickVertex,

GLcharARB *brickFragnient)

f

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

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

GLint linked: Аргумент brick Vertex содержит указатель на исходный код вершинного шейдера кирпичной стены, а аргумент bri «Fragment содержит указатель на исходный код фрагментного шейдера кирпичной стены. Далее определяются переменные Для хранения идентификаторов трех объектов OpenGL: шейдерный объект, который будет использоваться для хранения и компиляции вершинного шейдера, второй шейдерный объект, который будет использоваться для хранения и компиляции фрагментного шейдера, и программный объект, к которому будут присоединены шейдерные объекты. Потом определяются флаги, показывающие результат компиляции и компоновки.

Первый шаг - создание двух пустых шейдерных объектов, одного для вершинного шейдера и одного для фрагментного шейдера:

brickVS = glС rea teSha derObj ect ARB(GL_VERTE X_SHADER_ARB): brickFS = glCreateShaderObjectARB(GL„FRAGMENT_SHADER_ARB): Исходный код можно загружать в шейдерные объекты после их создания, когда они пустые и код их состоит из пустой строки с нуль-символом. Например, так:

glShaderSourceARBfbrickVS. 1, &brickVertex. NULL): glShaderSourceARBtbrickFS. 1. SbrickFragment. NULL): Теперь шейдеры можно компилировать. Для каждого шейдера вызывается функция gl Cornpi 1 eShaderARB, а потом glGetObjectParameterARB, чтобы видеть, что происходит. Функция gl Compi 1 eShaderARB установит параметр GL_OBJECT_COMPILE_ STATUS_ARB шейдерного объекта в значение GL TRUE при успешном завершении операции или в GL_FALSE - в противном случае. Вне зависимости от результата операции на экран будет выведен информационный журнал шейдера. Если компиляция была неудачной, он будет содержать сообщения об ошибках компиляции. Если компиляция завершилась нормально, журнал все равно может содержать полезную информацию, которая поможет совершенствовать шейдер. Проверка компиляционного журнала необходима только во время разработки программы либо при первом запуске шейдера на новой платформе. Если компиляция не выполнена либо шейдер не запускается, приложение должно завершить работу: glCompileShaderARB(brickVS):

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

gl GetObjectParameters vAREK bri ckVS.

GL_0BJECT_C0MPILE_STATI)S_ARB, SvertCompi 1 ed); printlnfoLog(bnckVS):

glCompileShaderARB(brickFS):

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


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