Массивы вершин
Если вершин много, то чтобы не вызывать для каждой команду glVertex*(), удобно объединять вершины в массивы, используя команду
void glVertexPointer (GLint size, GLenum type, GLsizei stride, void* ptr),
которая определяет способ хранения и координаты вершин. При этом size определяет число координат вершины (может быть равен 2, 3, 4), type определяет тип данных (может быть равен GL_SHORT, GL_INT, GL_FLOAT, GL_DOUBLE). Иногда удобно хранить в одном массиве другие атрибуты вершины, тогда параметр stride задает смещение от координат одной вершины до координат следующей; если stride равен нулю, это значит, что координаты расположены последовательно. В параметре ptr указывается адрес, где находятся данные. Аналогично можно определить массив нормалей, цветов и некоторых других атрибутов вершины, используя команды:
void glNormalPointer (GLenum type, GLsizei stride, void * pointer); void glColorPointer (GLint size, GLenum type, GLsizei stride, void * pointer).
Для того, чтобы эти массивы можно было использовать в дальнейшем, надо вызвать команду
void glEnableClientState (GLenum array)
с параметрами GL_VERTEX_ARRAY, GL_NORMAL_ARRAY, GL_COLOR_ARRAY соответственно. После окончания работы с массивом желательно вызвать команду
void glDisableClientState (GLenum array)
с соответствующим значением параметра array. Для отображения содержимого массивов используется команда
void glArrayElement (GLint index),
которая передает OpenGL атрибутывершины, используя элементы массива с номером index. Это аналогично последовательному применению команд вида glColor*(…), glNormal*(…), glVertex*(…) c соответствующими параметрами. Однако вместо нее обычно вызывается команда
void glDrawArrays (GLenum mode, GLint first, GLsizei count),
рисующая count примитивов, определяемых параметром mode, используя элементы из массивов с индексами от first до first + count -1. Это эквивалентно вызову последовательности команд glArrayElement() с соответствующими индексами. В случае, если одна вершина входит в несколько примитивов, то вместо дублирования ее координат в массиве удобно использовать ее индекс. Для этого надо вызвать команду
void glDrawElements (GLenum mode, GLsizei count, GLenum type, void * indices),
где indices – это массив номеров вершин, которые надо использовать для построения примитивов, type определяет тип элементов этого массива: GL_UNSIGNED_BYTE, GL_UNSIGNED_SHORT, GL_UNSIGNED_INT, а count задает их количество. Важно отметить, что использование массивов вершин позволяет оптимизировать передачу данных на сервер OpenGL, и, как следствие, повысить скорость рисования трехмерной сцены. Такой метод определения примитивов является одним из самых быстрых и хорошо подходит для визуализации больших объемов данных.
|