Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Semenov_Evgeniy_Zapiska.docx
Скачиваний:
3
Добавлен:
18.12.2018
Размер:
157.33 Кб
Скачать
    1. Ждлдлждлэжлд OpenGl

Объявление стандартных функций OpenGL находится в файле gl.h, поэтому ваш файл исходного кода, содержащий функции OpenGL, должен включать gl.h:

#include <GL/gl.h>

Кроме того, линковщику нужно указать статические библиотеки, с внешними функциями. Например, для функций, объявленных в gl.h, необходимо добавить в проект opengl32.lib.

В OpenGL нет встроенных функций для инициализации OpenGL. Это связано с тем, что OpenGL является независимым от платформы графическим API. Инициализацию обеспечивает операционная среда. То есть окно OpenGL создается как обычное окно Windows, что было описано в подпункте 3.2.

После создания окна необходимо установить формат пикселя.

Это можно сделать при помощи объекта структуры PIXELFORMATDESCRIPTOR и вызова функции SetPixelFormat.

Если удалось установить пиксельный формат, то необходимо создать просчитывающий контекст (rendering context) OpenGL. Это делается вызовом функции wglCreateContext().

После этих действий можно приступать к рисованию сцены.

OpenGL поддерживает следующие типы геометрических примитивов: точки (points), линии (lines), ломаные (line strips), замкнутые ломаные (line loops), треугольники (triangles), соединенные треугольники (triangle strips), треугольники с одной общей вершиной (triangle fans), четырехугольники (quadrilaterals), соединенные четырехугольники (quadrilateral strips) и многоугольники (polygons). В OpenGL существует 3 основных пути указания геометрических данных. Первый метод позволяет указывать одну вершину за раз. Для начала примитива вызывается glBegin(), а для его завершения - glEnd(). Между этими вызовами с помощью команд, подобных glVertex(), glColor(), glNormal(), glTexCoord() и так далее, устанавливаются такие атрибуты вершин (vertex atributes), как позиция, цвет, вектор нормали, флаг ребра, вторичный цвет, координаты текстуры и тумана. (Существует большое количество вариаций перечисленных команд, позволяющих приложению передавать в них аргументы различных типов, а также выбирать метод передачи: по ссылке или по значению.) Вплоть до и, включая версию 1.5 OpenGL, не существовало способа указания вершинных данных, определенных пользователем. Единственными атрибутами, задаваемыми для каждой вершины, были те, которые оговорены спецификацией OpenGL.

Когда используется описанный метод указания геометрии, вызов glVertex()сигнализирует об окончании определения данных для каждой вершины. Этот же вызов может означать завершение примитива. После вызова glBegin() с указанием типа примитива, геометрический примитив завершается каждый раз, когда glVertex()вызывается достаточное количество раз для его определения в соответствии с указанным типом. Например, каждый независимый треугольник требует трех вызововglVertex(), а в случае соединенных треугольников - для первого требуется три вершины, для последующих - еще по одной.

Второй метод рисования геометрических примитивов заключается в использовании вершинных масивов. При использовании данного метода приложение сохраняет атрибуты вершин в определенных пользователем массивах, задает указатели на массивы и использует команды glDrawArrays(), glMultiDrawArrays(),glDrawElements(), glMultiDrawElements(), glDrawRangeElements() иglInterleavedArrays() для рисования большого числа примитивов за 1 раз. Поскольку перечисленные точки входа способны эфективно передавать большой объем геометрических данных в OpenGL, приложения используют их в тех частях кода, где особенно требуется быстродействие. Метод с использованием glBegin()/glEnd() требует одного вызова функции для каждого атрибута каждой вершины, поэтому при рисовании объектов с тысячами вершин количество вызовов функций может быстро вырости до неприличного. Напротив, после того как вершинные данные организованы в массивы, использование вершинных массивов позволяет нарисовать большое число примитивов с помощью всего одного вызова функции. Обработка массивов в такой манере может быть быстрее, поскольку часто для реализации OpenGL проще работать с данными, организованными таким образом. Текущий массив цветовых величин задается с помощью glColorPointer(), текущий массив координат вершин - с помощью glVertexPointer(), текущий массив нормалей - с помощью glNormalPointer() и так далее. Функция glInterleavedArrays() используется для задания одного массива в качестве хранилища для атрибутов разных типов (то есть каждая вершина может быть определена 3-мя координатами типа float, за которыми в том же массиве следуют 3 цветовых компонента того же типа, за которыми следуют три координаты, задающими направление нормали, типа float и так далее).

Библиотека GLUT предоставляет пользователю несколько функций, позволяющих отрисовывать готовые трехмерные геометрические фигуры:

void gluSphere(GLUquadricObj *qobj, GLdouble radius, GLint slices, GLint stacks)

Строит сферу с центром в начале координат и радиусом radius. При этом число разбиений сферы вокруг оси z задается параметром slices, а вдоль оси z – параметром stacks.

void gluCylinder(GLUquadricObj *qobj,GLdouble baseRadius,GLdouble topRadius, GLdouble height, GLint slices, GLint stacks)

Строит цилиндр без оснований (то есть кольцо), продольная ось параллельна оси z, заднее основание имеет радиус baseRadius, и расположено в плоскости z=0, переднее основание имеет радиус topRadius и расположено в плоскости z= height. Если задать один из радиусов равным нулю, то будет построен конус.

Для задания различных преобразований объектов сцены в OpenGL используются операции над матрицами, при этом различают три типа матриц: видовая, проекций и текстуры. Все они имеют размер 4x4. Видовая матрица определяет преобразования объекта в мировых координатах, такие как параллельный перенос, изменение масштаба и поворот. Матрица проекций задает, как будут проецироваться трехмерные объекты на плоскость экрана (в оконные координаты), а матрица текстуры определяет наложение текстуры на объект.

Для того чтобы выбрать, какую матрицу надо изменить, используется команда

void glMatrixMode(GLenum mode)

вызов которой со значением параметра mode равным GL_MODELVIEW, GL_PROJECTION, GL_TEXTURE включает режим работы с видовой, проекций и матрицей текстуры соответственно. Для вызова команд, задающих матрицы того или иного типа необходимо сначала установить соответствующий режим.

Для определения элементов матрицы текущего типа вызывается команда

void glLoadMatrix[f d](GLtype *m)

где m указывает на массив из 16 элементов типа float или double в соответствии с названием команды, при этом сначала в нем должен быть записан первый столбец матрицы, затем второй, третий и четвертый.

Команда

void glLoadIdentity(void)

заменяет текущую матрицу на единичную. Часто нужно сохранить содержимое текущей матрицы для дальнейшего использования, для чего используют команды

void glPushMatrix(void)

void glPopMatrix(void)

Они записывают и восстанавливают текущую матрицу из стека, причем для каждого типа матриц стек свой. Для видовых матриц его глубина равна как минимум 32, а для двух оставшихся типов как минимум 2.

Для умножения текущей матрицы слева на другую матрицу используется команда

void glMultMatrix[f d](GLtype *m)

где m должен задавать матрицу размером 4x4 в виде массива с описанным расположением данных. Однако обычно для изменения матрицы того или иного типа удобно использовать специальные команды, которые по значениям своих параметров создают нужную матрицу и перемножают ее с текущей. Чтобы сделать текущей созданную матрицу, надо перед вызовом этой команды вызвать glLoadIdentity().

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]