23
атрибутами цвета.
V[0][0] = 0.0; V[0][1] = 2.0; C[0][0] = 1.0; C[0][1] = 0.0; C[0][2] = 0.0;
V[1][0] = 2.0; V[1][1] = 1.0; C[1][0] = 0.0; C[1][1] = 1.0; C[1][2] = 0.0;
V[2][0] = 1.5; V[2][1] = –1.0; C[2][0] = 0.0; C[2][1] = 0.0; C[2][2] = 1.0;
V[3][0] = –1.5; V[3][1] = –1.0; C[3][0] = 0.0; C[3][1] = 0.5; C[3][2] = 0.0;
V[4][0] = –2.0; V[4][1] = 1.0; C[4][0] = 1.0; C[4][1] = 0.5; C[4][2] = 1.0;
3 шаг: Указываем OpenGL, что данные этих массивов будут использоваться командами glVertex-
Pointer и glColorPointer для размещения в специализированных внутренних массивах вершин и цветов.
glVertexPointer(2, GL_FLOAT, 0, V);
glColorPointer(3, GL_FLOAT, 0, C);
4 шаг: Разрешаем работать OpenGL с внутренним массивом вершин и массивом цветов.
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
5 шаг: Рисуем пятиугольник.
glDrawArrays(GL_POLYGON, 0, 5);
6 шаг: Делаем недоступными массивы вершин и цветов
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);
Вот и все.
Если воспользоваться третьем параметром команды gl*Pointer, то подобную задачу можно выпол-
нить более компактно. Для этого разместим исходные данные на вершины и их цветов в перебежку
(вершина, цвет, вершина, цвет т т.д.) в одном одномерном массиве:
GLfloat VC[] = { 0.0, 2.0, 1.0, 0.0, 0.0,
2.0, 1.0, 0.0, 1.0, 0.0,
1.5, –1.0, 0.0, 0.0, 1.0,
–1.5, –1.0, 0.0, 0.5, 0.0,
–2.0, 1.0, 1.0, 0.5, 1.0 };
Далее вызываем команды glVertexPointer и glColorPointer:
glVertexPointer(2,GL_FLOAT, 5*sizeof(GLfloat), &VC[0]);
glColorPointer(3, GL_FLOAT, 5*sizeof(GLfloat), &VC[2]);
Обратите внимание на то, что массив вершин будет набираться с первого элемента массива VC по
два значения типа float c шагом 5*sizeof(GLfloat). На правильность выбранного шага подсказывает тот
факт, что порядковые номера одноименных данных в массиве VC отличаются друг ото друга на 5. А так
как тип элементов массива float, то и смещение определяется выражением 5*sizeof(GLfloat). Первые два
числа в массиве всегда относятся к вершине объекта, а начиная с третьего, точнее с номера 2, так как
нумерация элементов в массиве идет с номера – 0, параметры цвета соответствующей вершины.
И в завершении уже знакомые команды:
glDrawArrays(GL_POLYGON, 0, 5);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);
На экране мы получаем такой же результат, что и в предыдущем примере.
8 РАБОТА СО СПИСКАМИ ИЗОБРАЖЕНИЙ
В OpenGL предоставляется возможность объединять группу команд под определенным именем для
последующего выполнения. Это обеспечивают списки изображений (дисплейные списки). Они подобны
подпрограммам и являются удобным средством для кодирования больших систем со сложной иерархи-
ей. Список организуется командами:
void glNewList (GLuint list, GLenum mode)
void glEndList ()
Эти команды выглядят, как операторные скобки. Первая команда является заголовком (началом)
нового списка изображений. Список заканчивается командой glEndList(). Параметр list представляет со-
бой целочисленный идентификатор – имя списка. Параметр mode – символическая константа, опреде-
ляющая следующие режимы сборки списка:
Константа Режим сборки списка