После того как шейдеры скомпилированы, связаны с программным объектом и скомпонованы, можно рисовать систему частиц. Все, что для этого нужно сделать, - вызвать функцию drawPoi nts, приведенную в листинге 13.4. В этой функции размер точки устанавливается в 2, чтобы выполнять рендеринг немного больших точек. Следующие четыре строки кода устанавливают указатели на используемые массивы вершин. В данном шейдере используются четыре массива: для координат вершин (начальные координаты частиц), для цвета частиц, для начальной скорости и начального времени (времени рождения) частиц. После этого вызываются функции gl Enabl eCl ientState для стандартных атрибутов вершин и gl Enabl е-VertexAttribArrayARB - для дополнительных атрибутов вершин, чтобы массивы стали доступными. Потом вызывается функция glDrawArrays для рендеринга точек, и, наконец, доступ к массивам закрывается.
Листинг 13.4. Программа на языке С для рисования частиц как точек
void drawPointsO {
glPointSize(2.0):
glVertexPointer(3. GL_FL0AT, 0. verts)
продолжение &
Анимированные шейдеры
Листинг 13.4 (продолжение)
glColorPointer (3. GLJL0AT. 0. colors); glVertex/^tribPointerARB(VELOCITY_ARRAY. 3. GLJLOAT.
GL_FALSE. 0. velocities): glVertexAttribPointerARB(START_TIME_ARRAY. 1. GL_FL0AT.
GLJALSE. 0. startTimes):
gl Enabled ientState(GL_VERTEX_ARRAY): glEnableClientState(GL_COLOR_ARRAY): glEnableVertexAttribArrayARB(VELOCITY_ARRAY): glEnableVertexAttribArrayARB(START_TIME_ARRAY);
glDrawArrays(GL_POINTS. 0. arrayWidth * arrayHeight):
glDi sableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);
glDi sableVertexAttri bArrayARBf VELOCITY_ARRAY);
glDisableVertexAttribArrayARB(START_TIME_ARRAY):
}
Чтобы получить эффект анимации, приложение должно передавать свое значение времени вершинному шейдеру (листинг 13.5). Переменная Part ici eTi me увеличивается на единицу при смене кадров, и это значение заносится в uniform-переменную Time. Это позволяет вершинному шейдеру учитывать значение времени в вычислениях.
Листинг 13.5. Фрагмент кода на языке С для обновления переменной с новым кадром