ПРИМЕЧАНИЕ
Включение режима GL_NORMALIZE негативно влияет на скорость работы механизма визуализации OpenGL. В силу этого более предпочтительным является задание заранее приведенных к единичной длине нормалей. Нормализация нормалей необходима для правильного расчета освещения. Режим автоматической нормализации должен быть включен, если приложением используется преобразования растяжения/сжатия, поскольку в этом случае длина нормалей изменяется при умножении на видовую матрицу.
Операторные скобки Begin/End
Мы рассмотрели задание атрибутов одной вершины. Однако чтобы задать какую-нибудь фигуру, одних координат вершин недостаточно, и эти вершины надо объединить в одно целое, определив необходимые свойства. Для этого в OpenGL используется понятие примитивов, к которым относятся точки, линии, связанные или замкнутые линии, треугольники и так далее. Задание примитива происходит внутри командных скобок:
void glBegin(GLenum mode);
void glEnd(void);
Параметр mode определяет тип примитива, который задается внутри и может принимать следующие значения:
GL_POINTS |
каждая вершина задает координаты некоторой точки. |
GL_LINES |
каждая отдельная пара вершин определяет отрезок; если задано нечетное число вершин, то последняя вершина игнорируется. |
GL_LINE_STRIP |
каждая следующая вершина задает отрезок вместе с предыдущей. |
GL_LINE_LOOP |
отличие от предыдущего примитива только в том, что последний отрезок определяется последней и первой вершиной, образуя замкнутую ломаную. |
GL_TRIANGLES |
каждая отдельная тройка вершин определяет треугольник; если задано не кратное трем число вершин, то последние вершины игнорируются. |
GL_TRIANGLE_STRIP |
каждая следующая вершина задает треугольник вместе с двумя предыдущими. |
GL_TRIANGLE_FAN |
треугольники задаются первой и каждой следующей парой вершин (пары не пересекаются). |
GL_QUADS |
каждая отдельная четверка вершин определяет четырехугольник; если задано не кратное четырем число вершин, то последние вершины игнорируются. |
GL_QUAD_STRIP |
четырехугольник с номером n определяется вершинами с номерами 2n-1, 2n, 2n+2, 2n+1. |
GL_POLYGON |
последовательно задаются вершины выпуклого многоугольника. |
Рис. 1
ПРИМЕЧАНИЕ
Использование GL_TRIANGLE_STRIP и GL_TRIANGLE_FAN позволяет повысить производительность приложения.
Например, чтобы нарисовать треугольник с разными цветами в вершинах, достаточно написать:
GLfloat BlueCol[3] = {0,0,1};
glBegin(GL_TRIANGLE);
glColor3f(1.0, 0.0, 0.0); /* красный */
glVertex3f(0.0, 0.0, 0.0);
glColor3ub(0, 255, 0); /* зеленый */
glVertex3f(1.0, 0.0, 0.0);
glColor3fv(BlueCol); /* синий */
glVertex3f(1.0, 1.0, 0.0);
glEnd();
Кроме задания самих примитивов можно определить метод их отображения на экране (под примитивами в данном случае понимаются многоугольники).
Однако сначала надо определить понятие лицевых и обратных граней.
Под гранью понимается одна из сторон многоугольника, и по умолчанию лицевой считается та сторона, вершины которой обходятся против часовой стрелки. Направление обхода вершин лицевых сторон можно изменить вызовом команды
void glFrontFace(GLenum mode)
со значением параметра mode равным GL_CW, а отменить — с GL_CCW.
Чтобы изменить метод отображения многоугольника используется команда
void glPolygonMode(GLenum face, Glenum mode)
Параметр mode определяет, как будут отображаться многоугольники, а параметр face устанавливает тип многоугольников, к которым будет применяться эта команда и может принимать следующие значения:
GL_FRONT |
для лицевых граней |
GL_BACK |
для обратных граней |
GL_FRONT_AND_BACK |
для всех граней |
Параметр mode может быть равен:
GL_POINT |
при таком режиме будут отображаться только вершины многоугольников. |
GL_LINE |
при таком режиме многоугольник будет представляться набором отрезков. |
GL_FILL |
при таком режиме многоугольники будут закрашиваться текущим цветом с учетом освещения, и этот режим установлен по умолчанию. |
Кроме того, можно указывать, какой тип граней отображать на экране. Для этого сначала надо установить соответствующий режим вызовом команды glEnable(GL_CULL_FACE), а затем выбрать тип отображаемых граней с помощью команды
Читать дальше