Нормаль
Определить нормальв вершине можно, используя команды
void glNormal3[b s i f d] (type coords) void glNormal3[b s i f d]v (type coords)
Для правильного расчета освещения необходимо, чтобы вектор нормали имел единичную длину. Командой glEnable(GL_NORMALIZE) можно включить специальный режим, при котором задаваемые нормали будут нормироваться автоматически. Режим автоматической нормализации должен быть включен, если приложение использует модельные преобразования растяжения/сжатия, так как в этом случае длина нормалей изменяется при умножении на модельно-видовую матрицу. Команды
void glEnable (GLenum mode) void glDisable (GLenum mode)
производят включение и отключение того или иного режима работы конвейера OpenGL. Эти команды применяются достаточно часто, и их возможные параметры будут рассматриваться в каждом конкретном случае. Операторные скобки glBegin / glEnd Чтобы задать атрибуты графического примитива, одних координат вершин недостаточно. Эти вершины надо объединить в одно целое, определив необходимые свойства. Для этого в OpenGL используются операторные скобки, являющиеся вызовами специальных команд OpenGL Определение примитива или последовательностипримитивов происходит между вызовами команд
void glBegin (GLenum mode); void glEnd (void);
Параметр mode определяет тип примитива, который задается внутри и может принимать нижеприведенные значения (рис.12.4.3). 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 - последовательно задаются вершины выпуклого многоугольника. Пример, иллюстрирующий прорисовку треугольника с разными цветами в вершинах.
GLfloat BlueCol[3] = {0,0,1}; glBegin(GL_TRIANGLES); 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();
Как правило, разные типы примитивов имеют различную скорость визуализации на разных платформах. Для увеличения производительности предпочтительнее использовать примитивы, требующие меньшее количество информации для передачи на сервер, такие как GL_TRIANGLE_STRIP, GL_QUAD_STRIP, GL_TRIAGLE_FAN.
Рис. 12.4.3. Примитивы OpenGL
Кроме задания самих многоугольников, можно определить метод их отображения на экране. Однако сначала надо определить понятие лицевых и обратных граней. Под гранью понимается одна из сторон многоугольника, и по умолчанию лицевой считается та сторона, вершины которой обходятся против часовой стрелки.Направление обхода вершин лицевых граней можно изменить вызовом команды
void glFrontFace (GLenum mode)
со значением параметра mode равным GL_CW (clockwise), а вернуть значение по умолчанию можно, указав GL_CCW (counter-clockwise). Чтобы изменить метод отображения многоугольника используется команда
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), а затем выбрать тип отображаемых граней с помощью команды
void glCullFace (GLenum mode).
Вызов с параметром GL_FRONT приводит к удалению из изображения всех лицевых граней, а с параметром GL_BACK – обратных (установка по умолчанию).
|