Итак, мы уже узнали, что такое OpenGl и как правильно производить инициализацию. Так как OpenGl - это графическая библиотека, хотелось бы увидеть графику на экране! В этом примере мы изучим, как с помощью OpenGl можно вывести на экран примитивы.
Как вы, наверное, догадываетесь, объекты в векторной геометрии задаются набором вершин. Рассмотрим, как в OpenGl определяется вершина. Положение вершины определяется заданием координат в двух, трех, или четырехмерном пространстве. Это реализуется с помощью команды glVertex:
void glVertex [2 3 4] [s i f d ] (type coords)
void glVertex [2 3 4] [s i f d ]v (type *coords)(список координат )
Каждая команда задает 4 координаты вершины x, y, z, w. Команда glVertex2 получает значения x, y. Координата z в данном случае устанавливается в 0, а w равной 1. glVertex3 получает координаты x, y, z, а w равно 1. glVertex4 устанавливает все 4 координаты.
Для ассоциации с вершинами цветов, нормалей и текстурных координат используются текущие значения соответствующих данных, соответственно: s -GLshort, i - GLint, f - GLfloat, d - GLdouble. Для задания текущего цвета вершины используются команды:
void glColor [3 4] [b s i f] (GLtype components)
void glColor [3 4] [b s i f]v (GLtype components)
Первые три параметра задают R, G, B компоненты цвета, а последний определяет alpha-компоненту, с помощью которой задается уровень прозрачности объекта. Если разным вершинам задать различные цвета, тогда будет проводиться линейная интерполяция цветов данного примитива.
Для управления режимом интерполяции цветов используется команда:
void glShadeModel (GLenum mode)
Если mode равен GL_SMOOTH тогда интерполяция включена (установлено по умолчанию).
GL_FLAT - интерполяция отключена.
Также к текущей вершине можно определить нормаль, используя команды:
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.
Мы рассмотрели задание атрибутов одной вершины. Теперь чтобы задать какую-нибудь фигуру, одних координат недостаточно. Для этого в 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 последовательно задаются вершины выпуклого многоугольника.
Для того чтобы нарисовать треугольник с разными цветами в вершинах, с использованием разных методов установки цвета, достаточно написать:
GLfloat Blue[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(Blue); // Синий
glVertex3f(1.0, 1.0, 0.0);
glEnd();
Дальше рассмотрим процедуру, которая задает тип грани (лицевая или обратная), а точнее обход вершин лицевых сторон. Под гранью понимается одна из сторон многоугольника, и по умолчанию лицевой считается та сторона, вершины которой обходятся против часовой стрелки.
void glFrontFace(GLenum mode);
Соответственно mode равно GL_CCW (установлено по умолчанию) или GL_CW.
Мы можем указать OpenGl метод отображения многоугольников:
void glPolygonMode(GLenum face, GLenum mode);
Параметр mode определяет, как будут отображаться многоугольники, а face устанавливает тип многоугольников, к которым будет применяться эта команда и может принимать следующие значения:
GL_FRONT для лицевых граней.
GL_BACK для обратных граней.
GL_FRONT_BACK для всех граней.
Параметр mode:
GL_POINT отображаются только вершины многоугольников.
GL_LINE отображаются только линии.
GL_FILL отображается многоугольник с текущим цветом и учетом освещения (установлен по умолчанию).
Еще можно указать какой тип граней будет отображаться на экране. Для этого необходимо установить соответствующий режим командой glEnable(GL_CULL_FACE), а потом выбрать тип отображаемых граней:
void glCullFace(GLenum mode);
Параметр GL_FRONT приводит к удалению всех лицевых граней , а параметр GL_BACK - обратных (установлен по умолчанию).
Итак, в этой части мы узнали, каким образом в OpenGl как задаются параметры вершин, какие виды примитивов, возможно, использовать, а также вывод лицевых и обратных граней. В следующей статье мы узнаем, как использовать массивы вершин и что такое индексные примитивы.