Автор работы: Пользователь скрыл имя, 10 Марта 2010 в 00:12, Не определен
Структура и применение OpenGl
Основные библиотеки, используемые при создании приложений
Массивы вершин и списки изображений (назначение и команды для их описания)
Преобразование проецирования, задание ортографической и перспективной проекции
Задание и исходный код
Рисунок
Использованные источники
Оглавление
Структура и применение OpenGL
OpenGL
(Open Graphics Library — открытая графическая
библиотека) — спецификация, определяющая
независимый от языка
Включает более 250-ти функций для рисования сложных трехмерных сцен из простых примитивов. Используется при создании видео-игр, САПР, виртуальной реальности, визуализации в научных исследованиях. На платформе Windows конкурирует с DirectX.
OpenGL
ориентируется на следующие
Основным принципом работы OpenGL является получение наборов векторных графических примитивов в виде точек, линий и многоугольников с последующей математической обработкой полученных данных и построением растровой картинки на экране и/или в памяти. Векторные трансформации и растеризация выполняются графическим конвейером (graphics pipeline), который, по сути, представляет собой дискретный автомат. Абсолютное большинство команд OpenGL попадают в одну из двух групп: либо они добавляют графические примитивы на вход в конвейер, либо конфигурируют конвейер на различное исполнение транформаций.
OpenGL
является низкоуровневым
Этапы обработки данных в системе OpenGL:
Основные
библиотеки используемые
при создании приложений
OpenGL является на данный момент одним из самых популярных программных интерфейсов (API) для разработки приложений в области двумерной и трехмерной графики. Стандарт OpenGL был разработан и утвержден в 1992 году ведущими фирмами в области разработки программного обеспечения, а его основой стала библиотека IRIS GL, разработанная Silicon Graphics.
На данный момент реализация OpenGL включает в себя несколько библиотек. Были созданы библиотеки для отображения информации с помощью оконной подсистемы для операционных систем Windows и Unix (WGL и GLX соответственно), а также библиотеки GLAUX и GLUT, которые используются для создания так называемых консольных приложений.
Библиотека
GLAUX уступает по популярности написанной
несколько позже библиотеке GLUT, хотя
они предоставляют примерно одинаковые
возможности.
Массивы вершин и списки изображений
Назначение
и команды для
их описания
Под
вершиной понимается точка в трехмерном
пространстве, координаты которой можно
задавать следующим образом:
void glVertex[2 3 4][s i f d](type coords)
void
glVertex[2 3 4][s i f d]v(type *coords)
Координаты точки задаются максимум четырьмя значениями: x, y, z, w, при этом можно указывать два (x,y) или три (x,y,z) значения, а для остальных переменных в этих случаях используются значения по умолчанию: z=0, w=1. Как уже было сказано выше, число в названии команды соответствует числу явно задаваемых значений, а последующий символ – их типу.
Координатные оси расположены так, что точка (0,0) находится в левом нижнем углу экрана, ось x направлена влево, ось y- вверх, а ось z- из экрана. Это расположение осей мировой системы координат, в которой задаются координаты вершин объекта.
Однако
чтобы задать какую-нибудь фигуру одних
координат вершин недостаточно, и
эти вершины надо объединить в
одно целое, определив необходимые
свойства. Для этого в OpenGL используется
понятие примитивов, к которым относятся
точки, линии, связанные или замкнутые
линии, треугольники и так далее. Задание
примитива происходит внутри командных
скобок:
void glBegin(GLenum mode)
void
glEnd(void)
Параметр mode определяет тип примитива, который задается внутри и может принимать различные значения:
GL_POINTS
каждая вершина задает
GL_LINES
каждая отдельная пара вершин
определяет отрезок; если
GL_LINE_STRIP
каждая следующая вершина
GL_LINE_LOOP
отличие от предыдущего
GL_TRIANGLE_STRIP
каждая следующая вершина
GL_TRIANGLE_FAN треугольники задаются первой и каждой следующей парой вершин (пары не пересекаются).
GL_QUADS
каждая отдельная четверка
GL_QUAD_STRIP четырехугольник с номером n определяется вершинами с номерами 2n-1, 2n, 2n+2, 2n+1.
GL_POLYGON
последовательно задаются
Массивы
вершин
Если
вершин много, то чтобы не вызывать
для каждой команду glVertex..(), удобно объединять
вершины в массивы, используя команду,
void
glVertexPointer( GLint size, GLenum type, GLsizei stride, void *ptr
)
которая определяет способ хранения и координаты вершин. При этом size определяет число координат вершины (может быть равен 2, 3, 4), type определяет тип данных (может быть равен GL_SHORT, GL_INT, GL_FLOAT, GL_DOUBLE). Иногда удобно хранить в одном массиве другие атрибуты вершины, и тогда параметр stride задает смещение от координат одной вершины до координат следующей; если stride равен нулю, это значит, что координаты расположены последовательно. В параметре ptr указывается адрес, где находятся данные.
Аналогично
можно определить массив нормалей,
цветов и некоторых других атрибутов
вершины, используя команды
void NormalPointer(GLenum type, GLsizei stride, void*pointer)
void
ColorPointer(GLintsize, GLenum type, GLsizei stride, void *pointer)
Для
того, чтобы эти массивы можно
было использовать в дальнейшем, надо
вызвать команду:
void
glEnableClientState(GLenum array)
с
параметрами GL_VERTEX_ARRAY, GL_NORMAL_ARRAY, GL_COLOR_ARRAY
соответственно. После окончания работы
с массивом желательно вызвать команду:
void
glDisableClientState(GLenum array)
с
соответствующим значением
Для
отображения содержимого
void
glArrayElement(GLint index)
которая
передает OpenGL атрибуты вершины, используя
элементы массива с номером index. Это
аналогично последовательному применению
команд вида glColor..(…), glNormal..(…), glVertex..(…)
c соответствующими параметрами. Однако
вместо нее обычно вызывается команда:
void
glDrawArrays(GLenum mode, GLint first, GLsizei count)
рисующая count примитивов, определяемых параметром mode, используя элементы из массивов с индексами от first до first+count-1. Это эквивалентно вызову команды glArrayElement() с соответствующими индексами.
В случае если одна вершина входит в несколько примитивов, то вместо дублирования ее координат в массиве удобно использовать ее индекс.
Для
этого надо вызвать команду
void
glDrawArrays(GLenum mode, GLsizei count, GLenum type, void *indices)
где
indices – это массив номеров вершин, которые
надо использовать для построения примитивов,
type определяет тип элементов этого массива:
GL_UNSIGNED_BYTE, GL_UNSIGNED_SHORT, GL_UNSIGNED_INT, а count задает
их количество.
Списки
изображений
Если
нужно несколько раз обращаться
к одной и той же группе команд,
эти команды можно объединить в так называемый
список изображений (display list) и вызывать
его при необходимости. Для того, чтобы
создать новый список изображений надо
поместить все команды, которые должны
в него войти между командными скобками:
void glNewList(GLuint list, GLenum mode)
void
glEndList()
Для различения списков используются целые положительные числа, задаваемые при создании списка значением параметра list, а параметр mode определяет режим обработки команд, входящих в список:
GL_COMPILE команды записываются в список без выполнения
GL_COMPILE_AND_EXECUTE команды сначала выполняются, а затем записываются в список
После
того, как список создан, его можно
вызвать командой:
void
glCallList(GLuint list)
указав
в параметре list идентификатор нужного
списка. Чтобы вызвать сразу несколько
списков, можно воспользоваться
командой:
void
glCallLists(GLsizei n, GLenum type, const GLvoid *lists)
вызывающей
n списков с идентификаторами из массива
lists, тип элементов которого указывается
в параметре type. Это могут быть типы GL_BYTE,
GL_UNSIGNED_BYTE, GL_SHORT, GL_INT, GL_UNSIGNED_INT и некоторые
другие. Для удаления списков используется
команда:
void
glDeleteLists(GLint list, GLsizei range)
которая
удаляет списки с идентификаторами
ID из диапазона list<=ID<= list+range-1.
Преобразование
проецирования, задание
ортографической и перспективной
проекции
В OpenGL используются как основные три системы координат: левосторонняя, правосторонняя и оконная. Первые две системы являются трехмерными и отличаются друг от друга направлением оси z: в правосторонней она направлена на наблюдателя, а в левосторонней – в глубь экрана. Расположение осей x и y аналогично описанному выше. Левосторонняя система используется для задания значений параметрам команды gluPerspective(), glOrtho(), а правосторонняя или мировая система координат во всех остальных случаях. Отображение трехмерной информации происходит в двумерную оконную систему координат.
Для
задания различных
Для
того чтобы выбрать, какую матрицу
надо изменить, используется команда
void
glMatrixMode(GLenum mode)
вызов которой со значением параметра mode равным GL_MODELVIEW, GL_PROJECTION, GL_TEXTURE включает режим работы с видовой, проекций и матрицей текстуры соответственно. Для вызова команд, задающих матрицы того или иного типа необходимо сначала установить соответствующий режим.