Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Професиональное программирование


Информационный Канал Subscribe.Ru

Доброго времени суток, уважаемые подписчики.

Анонсы сайта:
У нас появилась рубрика "Обзоры", где мы рассматриваем различные программы с точки зрения пользователя.
На главной странице интерактивная лента новостей, ждет, от каждого из вас, пополнения.
Форум набрал за месяц своего существования более 1000 постингов. За это всем нашим посетителям огромное спасибо.

Как небольшой итог нашего двухмесячного существования - 13 место в рейтинге сайтов программистской направленности mail.ru. Мы благодарны всем посетившим нас, и обещаем не снижать темпов пополнения эксклюзивных материалов.

Громозека.

Выпуск 9.

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

Продолжение следует...


Всего вам доброго.
Рома roma_k@ukrwest.net
Сайт и форумы: http://comp-u.wp-club.net
Ёмайл: subscribe@comp-u.wp-club.net


http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное