OpenGL. Компьютерная графика. Васильев С.А. - 20 стр.

UptoLike

Составители: 

22
7 РАБОТА С МАССИВАМИ ВЕРШИН И ИХ АТРИБУТОВ
При моделировании объектов с большим количеством вершин можно не вызывать многократно ко-
манду glVertex* (), а воспользоваться командой:
void glVertexPointer (GLint s, GLenum t, GLsizei st, const GLvoid *p)
Данная команда задает массив с координатами вершин. Здесь s количество координат в каждой
вершине и должно быть установлено в 2, 3 или 4. Параметр t задает тип значения для координаты в мас-
сиве и может принимать одну из следующих символьных констант GL_SHORT, GL_INT, GL_FLOAT
и GL_DOUBLE. Параметр st принимает значение смещения в байтах между координатами соседних
последовательных вершин. Если st равно нулю, то это означает, что координаты вершин расположены
последовательно в массиве. Иногда удобно в массиве располагать не только значения координат вер-
шин, но и некоторые сопутствующие атрибуты (текстурные координаты, нормали вершин, значения
цвета
и т.д.). В этом случае параметр st позволяет "раздвинуть" координаты вершин в массиве и оставить мес-
та для дополнительных данных. Параметр p является указателем на координаты первой вершины в мас-
сиве.
Такой подход к организации вершин объекта позволяет повысить скорость передачи данных в
OpenGL, что, в конечном счете, положительно влияет на скорость рисования этих объектов на экране.
Аналогично можно организовать массивы нормалей, цветов и текстурных координат. Для это су-
ществуют соответствующие команды:
void glNormalPointer (GLenum t , GLsizei s, const GLvoid *p)
void glColorPointer (GLint s, GLenum t, GLsizei st, const GLvoid *p)
void glTexCoordPointer(GLint s, GLenum t, GLsizei st, const GLvoid *p)
Чтобы разрешить работу с подобными массивами, необходимо вызвать команду
glEnableClientState() с соответствующим аргументом:
Аргумент Назначение
GL_VERTEX_ARRAY ДЛЯ МАССИВА
ВЕРШИН
GL_NORMAL_ARRAY
Для массива нормалей
GL_COLOR_ARRAY
Для массива цветов
GL_TEXTURE_COORD_ARR
AY
Для текстовых коор-
динат
Для запрещения работы с массивом используется команда –glDisableClientState с соответствующим
аргументом.
После того как требуемые массивы сформированы и работа с ними разрешена, воспроизведение
примитива осуществляется вызовом команды
void glDrawArrays (GLenum mode, GLint first, GLsizei count)
Эта команда осуществляет воспроизведение примитива, заданного параметром mode (см. команду
glBegin/glEnd). Всего отображается count элементов, начиная с номера, указанного параметром first.
Для отображения единственного параметра примитива используется команда
void glArrayElement (GLint index)
Параметр index задает номер отображаемого элемента примитива.
Кстати, внутренний механизм работы команды glDrawArrays() основан на последовательном вы-
полнении команды glArrayElement() count раз, начиная с first примитива.
Для закрепления материала рассмотрим простой пример. Пусть требуется нарисовать с помощью
glDrawArrays() пятиугольник с различными цветами вершин. Рассмотрим выполнение этой задачи по
шагам:
1 шаг: Объявляем массивы вершин (v) и цвета (c).
GLfloat V[5][2]; // Для x и y
GLfloat C[5][3]; // Для R, G и B
2 шаг: Заполняем массив (v) исходными значениями координат вершин пятиугольника и массив (c)