Итак, мы уже узнали, что такое 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 как задаются параметры вершин, какие виды примитивов, возможно, использовать, а также вывод лицевых и обратных граней. В следующей статье мы узнаем, как использовать массивы вершин и что такое индексные примитивы.
Information
  • Posted on 31.01.2010 22:31
  • Просмотры: 463