Листинг 13.3. Программа на языке С для создания начальных данных частиц

static GLint arrayWidth, arrayHeight: static GLfloat *verts = NULL : static GLfloat *colors = NULL: static GLfloat Velocities = NULL: static GLfloat *startTimes = NULL:
void createPoints(GLint w. GLint h) {
GLfloat *vptr. *cptr. *velptr, *stptr; GLfloat i. j:
if (verts != NULL) free(verts):
verts = malloc(w * h * 3 * sizeof(float)): colors = mallocCw * h * 3 * sizeof(float)): velocities = malloc(w * h * 3 * sizeof(float)): startTimes = malloc(w * h * sizeof(float)):
vptr = verts: cptr = colors: velptr = velocities; stptr = startTimes:
for (i = 0.5 / w - 0.5: i < 0.5: i = i + 1.0/w) for (j = 0.5 / h - 0.5: j < 0.5: j = j + 1.0/h) {
*vptr = i: *(vptr + 1) = 0.0; *(vptr + 2) = j:

13.6. Системы частиц

vptr += 3:
*cptr = ((float) randO / RAND_MAX) * 0.5 + 0.5:
*(cptr + 1) = ((float) randO / RAND_MAX) * 0.5 + 0.5: *(cptr + 2) = ((float) randO / RAND_MAX) * 0.5 + 0.5: cptr += 3:
*velptr = (((float) randO / RAND_MAX)) + 3.0:
*(velptr + 1) = ((float) randO / RAND_MAX) * 10.0: *(velptr + 2) = (((float) randO / RAND_MAX)) + 3.0: velptr += 3:
*stptr = ((float) randO / RAND_MAX) * 10.0: stptr++:
}
arrayWidth = w: arrayHeight = h:
}

У OpenGL есть встроенные атрибуты координат и цвета вершины, которые и будут использоваться для передачи координат и цвета частицы. Начальную скорость и начальное время придется передавать через дополнительные атрибуты. Определим необходимые для этого константы:

Idefine VELOCITY_ARRAY 3 Idefine START_TIME_ARRAY 4

После создания программного объекта необходимо связать индексы дополнительных атрибутов с соответствующими именами переменных. (Это можно сделать даже до того, как вершинный шейдер связывается с программным объектом.) Все эти связи будут проверены и вступят в силу во время вызова функции glLink-ProgramARB. Чтобы связать индекс дополнительного атрибута с переменной вершинного шейдера, сделаем следующее:

glBindAttribLocat1onARB(Program0bject. VELOCITY_ARRAY. "Velocity"): glBindAttribLocationARB(ProgramObject. START_TIME_ARRAY. "StartTime"):

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