Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Компьютерная графика.doc
Скачиваний:
128
Добавлен:
04.11.2018
Размер:
2.92 Mб
Скачать
    1. Основы OpenGl

Все функции библиотеки OpenGL можно разделить на пять категорий:

  • Функции описания примитивов определяют объекты нижнего уровня иерархии (примитивы), которые способна отображать графическая подсистема. В OpenGL в качестве примитивов выступают точки, линии, многоугольники и т.д.;

  • Функции описания источников света служат для описания положения и параметров источников света, расположенных в трехмерной сцене;

  • Функции задания атрибутов. В качестве атрибутов OpenGL позволяет задавать цвет, характеристики материала, текстуры, параметры освещения;

  • Функции визуализации позволяют задать положение наблюдателя в виртуальном пространстве, параметры объектива камеры. Это позволяет не только правильно построить изображение, но и отсечь объекты, оказавшиеся вне поля зрения;

  • Набор функций геометрических преобразований позволяет выполнять различные преобразования объектов – поворот, перенос, масштабирование.

При этом OpenGL может выполнять дополнительные операции, такие как использование сплайнов для построения линий и поверхностей, удаление невидимых фрагментов изображений, работа с изображениями на уровне пикселей и т.д.

Интерфейс OpenGL

OpenGL состоит из набора библиотек. Все базовые функции хранятся в основной библиотеке (GL). Помимо основной, OpenGL включает в себя несколько дополнительных библиотек, которые могут подключаться как в виде отдельных модулей, так и в виде библиотек динамической компоновки (Dynamic Link Library - DLL).

Рис. 3.1 Организация библиотеки OpenGL

Библиотека GLU

GLU (OpenGL Utilities Library) содержит несколько подпрограмм, которые используют OpenGL для выполнения таких задач, как установка матриц для определенного ориентирования и проецирования просмотра, выполнение тесселяции многоугольников (разбиение произвольного многоугольника на выпуклые многоугольники) и визуализация поверхности. Библиотека GLU предоставляет множество возможностей моделирования: поверхности второго порядка, NURBS-кривые и NURBS-поверхности (Non-Uniform Rational B Spline - неравномерный рациональный B-сплайн). Библиотека GLU представляет собой стандартную часть реализации OpenGL. Существуют также наборы инструментов более высокого уровня, такие как FSG (Farengheit Scene Graph). Подпрограммы GLU используют префикс glu.

Библиотека GLUT

Для вывода изображения OpenGL-программы должны использовать механизмы системы управления окнами. Для этого можно вызывать функции API оконной системы, например, WinAPI, однако в этом случае приложение будет компилироваться только под одну выбранную оконную систему. Чтобы упростить задачу разработчикам, была создана библиотека GLUT (Graphics Library Utility Toolkit), которая представляет собой независимый от оконной системы инструментарий, написанный Марком Килгардом (Mark Kilgard) для того чтобы скрыть сложность программного интерфейса API различных оконных систем, отвечающих за создание окон, в которые будет производиться вывод генерируемых изображений, обработка нажатий клавиш клавиатуры, перемещение мыши и пр. Подпрограммы GLUT используют префикс glut. Функционально аналогичная библиотека GLX, интегрирующая Х Window с OpenGL, менее популярна.

Библиотека GLAUX

Вспомогательная библиотека GLAUX (OpenGL Auxiliary Library) содержит функции, создающие простые трёхмерные геометрические объекты, такие как сфера, куб, параллелепипед, цилиндр, конус и пр., функции, загружающие изображения из файлов, функции, работающие с окном вывода графики и т.д.

Синтаксис команд OpenGL

В названии команд OpenGL используется префикс gl и заглавные буквы для отделения слов, составляющих название команды (например, glClearColor()). Подобным же образом OpenGL определяет константы, начинающиеся с GL_ со всеми заглавными буквами и символом подчеркивания для отделения слов (например, GL_COLOR_BUFFER_BIT).

Следует также обратить внимание на буквы и цифры в конце названия некоторых команд (например, 3f в glColor3f() и glVertex3f()). Цифра 3 в названии команды glColor3f() означает, что она получает три аргумента, существует и другая версия, получающая четыре аргумента (четвертый – коэффициент прозрачности, называемый альфа - каналом). Буква f означает, что аргументы имеют формат числа с плавающей точкой. Подобное соглашение об именовании команд позволяет программисту использовать более удобный для него формат аргументов.

Некоторые команды воспринимают до восьми различных типов данных. Буквы, используемые в качестве суффиксов для указания конкретного типа данных в реализации OpenGL для ISO - стандарта языка C приведены в таблице 3.1.

Таблица 3.1. Суффиксы команд и соответствующие им типы аргументов

Суффиксы

Тип данных

Аналогичный тип языка С

Тип, определенный в OpenGL

b

целое 8 бит

signed char

GLbyte

s

целое 16 бит

short

GLshort

i

целое 32 бита

int или long

GLint, GLsizei

f

число с плавающей точкой 32 бита

float

GLfloat, GLclampf

d

число с плавающей точкой 64 бита

double

GLdouble, GLclampd

ud

беззнаковое целое 8 бит

unsigned char

GLubyte, GLboolean

us

беззнаковое целое 16 бит

unsigned short

GLushort

ui

беззнаковое целое 32 бита

unsigned int или unsigned long

GLuint, GLenum, GLbitfield

Примитивы библиотек GLU и GLUT

Рассмотрим стандартные команды построения примитивов, которые реализованы в библиотеках GLU и GLUT.

Чтобы построить примитив из библиотеки GLU, надо сначала создать указатель на quadric-объект с помощью команды gluNewQuadric(), а затем вызвать одну из команд: gluSphere(), gluCylinder(), gluDisk(), gluPartialDisk(). Рассмотрим эти команды отдельно (табл. 3.2).

Таблица 3.2. Функции библиотеки GLU

Название функции

Назначение

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. Если задать один из радиусов равным нулю, то будет построен конус. Параметры slices и stacks имеют аналогичный смысл, что и в предыдущей команде.

void gluDisk(

GLUquadricObj *qobj,

GLdouble innerRadius,

GLdouble outerRadius,

GLint slices,

GLint loops)

Функция строит плоский диск (то есть круг) с центром в начале координат и радиусом outerRadius. При этом если значение innerRadius отлично от нуля, то в центре диска будет находиться отверстие радиусом innerRadius. Параметр slices задает число разбиений диска вокруг оси z, а параметр loops – число концентрических колец, перпендикулярных оси z.

void gluPartialDisk(

GLUquadricObj *qobj,

GLdouble innerRadius,

GLdouble outerRadius,

GLint slices,

GLint loops,

GLdouble startAngle,

GLdouble sweepAngle)

Отличие этой функции от предыдущей заключается в том, что она строит сектор круга, начальный и конечный углы которого отсчитываются против часовой стрелки от положительного направления оси y и задаются параметрами startAngle и sweepAngle. Углы измеряются в градусах.

Команды, проводящие построение примитивов из библиотеки GLUT, реализованы через стандартные примитивы OpenGL и GLU. Для построения нужного примитива достаточно произвести вызов соответствующей команды. Объект каждого типа может быть создан в двух режимах – в виде сплошной трехмерной фигуры или каркасного объекта (для каркасного объекта фрагмент «Solid» в названии функции заменяется на «Wire»).

Таблица 3.2. Функции библиотеки GLUT

Название функции

Назначение

void glutSolidSphere (

GLdouble radius,

GLint slices,

GLint stacks)

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

void glutSolidCube(

GLdouble size)

Построение куба или каркаса куба с центром в начале координат и длиной ребра size.

void glutSolidCone(

GLdouble base,

GLdouble height,

GLint slices,

GLint stacks)

Функция строит конус или его каркас высотой height и радиусом основания base, расположенный вдоль оси z. Основание находится в плоскости z=0.

void glutSolidTorus(

GLdouble innerRadius,

GLdouble outerRadius,

GLint nsides,

GLint rings)

Построение тора или его каркаса в плоскости z=0. Внутренний и внешний радиусы задаются параметрами innerRadius, outerRadius. Параметр nsides задает число сторон в кольцах, составляющих ортогональное сечение тора, а rings – число радиальных разбиений тора.

void glutSolidTetrahedron (void)

void glutWireTetrahedron (void)

Функции строят тетраэдр (правильную треугольную пирамиду) или его каркас, при этом радиус описанной сферы вокруг него равен 1.

void glutSolidOctahedron (void)

void glutWireOctahedron (void)

Построение октаэдра или его каркаса, радиус описанной вокруг него сферы равен 1.

void glutSolidDodecahedron (void)

void glutWireDodecahedron (void)

Функции строят додекаэдр или его каркас, радиус описанной вокруг него сферы равен квадратному корню из трех.

void glutSolidIcosahedron (void)

void glutWireIcosahedron (void)

Построение икосаэдра или его каркаса, радиус описанной вокруг него сферы равен 1.

Для корректного построения перечисленных примитивов необходимо удалять невидимые линии и поверхности, для чего надо включить соответствующий режим вызовом команды glEnable(GL_DEPTH_TEST).