Статья
Версия для печати
Обсудить на форуме
OpenGL (часть 3)


Итак, мы уже узнали, что такое 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 как задаются параметры вершин, какие виды примитивов, возможно, использовать, а также вывод лицевых и обратных граней. В следующей статье мы узнаем, как использовать массивы вершин и что такое индексные примитивы.
Версия для печати
Обсудить на форуме