Введение - Библиотека OpenGL

OpenGL - это программный интерфейс к графической аппаратуре. Этот интерфейс состоит приблизительно из 250 отдельных команд (около 200 команд в самой OpenGL и еще 50 в библиотеке утилит), которые используются для указания объектов и операций, которые необходимо выполнить, чтобы получить интерактивное приложение, работающее с трехмерной графикой. оpengl программный интерфейс графический

Библиотека OpenGL разработана как обобщенный, независимый интерфейс, который может быть реализован для различного аппаратного обеспечения. По этой причине сама OpenGL не включает функций для создания окон или для захвата пользовательского ввода; для этих операций вы должны использовать средства той операционной системы, в которой вы работаете. По тем же причинам в OpenGL нет высокоуровневых функций для описания моделей трехмерных объектов. Такие команды позволили бы вам описывать относительно сложные фигуры, такие как автомобили, части человеческого тела или молекулы. При использовании библиотеки OpenGL вы должны строить необходимые модели при помощи небольшого набора геометрических примитивов - точек, линий и многоугольников (полигонов).

Тем не менее, библиотека, предоставляющая описанные возможности может быть построена поверх OpenGL. Библиотека утилит OpenGL (OpenGL Utility Library -- GLU) предоставляет множество средств для моделирования, например, квадрические поверхности, кривые и поверхности типа NURBS. GLU - стандартная часть любой реализации OpenGL. Существуют также и более высокоуровневые библиотеки, например, Fahrenheit Scene Graph (FSG), которые построены с использованием OpenGL и распространяются отдельно для многих ее реализаций.

В следующем списке коротко описаны основные графические операции, которые выполняет OpenGL для вывода изображения на экран.

    1. Конструирует фигуры из геометрических примитивов, создавая математическое описание объектов (примитивами в OpenGL считаются точки, линии, полигоны, битовые карты и изображения). 2. Позиционирует объекты в трехмерном пространстве и выбирает точку наблюдения для осмотра полученной композиции. 3. Вычисляет цвета для всех объектов. Цвета могут быть определены приложением, получены из расчета условий освещенности, вычислены при помощи текстур, наложенных на объекты или из любой комбинации этих факторов. 4. Преобразует математическое описание объектов и ассоциированной с ними цветовой информации в пиксели на экране. Этот процесс называется растеризацией (или растровой разверткой).

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

Общий порядок работы с библиотекой OpenGl таков:

    1. Инициализировать окно (получить область для вывода изображения) 2. Установить камеру 3. Включить свет (если это необходимо) 4. В цикле начать выводить примитивы (точки, линии, полигоны), предварительно очищая окно от предыдущего рисунка.

Инициализация окна.

Если вы работаете в Visual C++, то окно, создается при помощи функций

AuxInitPosition

AuxInitDisplayMode

AuxInitWindow

Основной цикл рисования кадра создается в функции Draw и регистрируется при помощи функции

AuxMainLoop(Draw);

Static void CALLBACK Draw(void) // создается пользователем

{...}

Void main()

{

// расположение окна OpenGL на экране

AuxInitPosition(100, 100, windowW, windowH);

// установка основных параметров работы OpenGL

// цветовой режим RGB | включение Z-буфера для сортировки по глубине

// |Двойная буферизация

AuxInitDisplayMode( AUX_RGB | AUX_DEPTH | AUX_DOUBLE );

// инициализация окна OpenGL с заголовком Title

If(auxInitWindow("Example1") ==GL_FALSE) auxQuit();

// регистрация функции, которая вызывается при перерисовке

// и запуск цикла обработки событий

// Draw() - функция пользователя

AuxMainLoop(Draw);

}

Если вы работаете в Borland C++ Builder, то для инициализации окна, надо получить Handle (уникальный идентификатор окна Windows) того окна, на котором вы будите рисовать. Handle имеется у всех окон-приложений верхнего уровня и у большинства дочерних окон. В наших примерах мы будем рисовать на дочернем окне StaticText.

Далее мы должны создать Контекст рисования (device context) и установить его формат. Для этого инициализируется структуру PIXELFORMATDESCRIPTOR (формат описания пикселей). В этой структуре описывается, требуется ли нам поддержка буфера глубины, двойной буферизации и проч.).

Затем следуют функции :

ChoosePixelFormat

SetPixelFormat

Создается контекст рисования OpenGL:

WglCreateContext(hdc);

А потом связываются контексты OpenGL и Windows:

WglMakeCurrent(hdc, hrc)

Void __fastcall TFormMain::FormCreate(TObject *Sender)

{

// возьмем ХЕНДЛ окошка StaticText

Static HWND Handle=a->Handle;

// создадим Хендл места рисования для окна StaticText

Hdc = GetDC (Handle) ;

// устанавливаем соответствующие настройки контекста устройства

PIXELFORMATDESCRIPTOR pfd = {

Sizeof(PIXELFORMATDESCRIPTOR),

1,

PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER,

PFD_TYPE_RGBA,

    24, 0,0,0,0,0,0, 0,0, 0,0,0,0,0, 32, 0, 0,

PFD_MAIN_PLANE,

    0, 0,0,

};

// выбрать соответствующий формат

PixelFormat = ChoosePixelFormat(hdc, &;pfd);

SetPixelFormat(hdc, PixelFormat, &;pfd);

// создадим контекст устройства для OpenGL

// используя Хендл места рисования

Hrc = wglCreateContext(hdc);

If(hrc == NULL)

ShowMessage(":-)~ hrc == NULL");

If(wglMakeCurrent(hdc, hrc) == false)

ShowMessage("Could not MakeCurrent");

...}

Установка камеры

По умолчанию камера расположена в начале координат (0, 0, 0), направлена вдоль отрицательного направления оси z, и вектором верхнего направления имеет (0, 1, 0).

Для установки камеры удобно использовать функцию gluLookAt(). Хотя она имеет 9 параметров, в них легко разобраться. Они делятся по три параметра, соответственно для трех точек: Eye (Глаз), Center, Up.

Глаз определяет точку откуда смотрим, Центр - куда смотрим, а вектор верха определяет, где у нас должен быть верх ( представьте себе пилота в самолете летящего головой вниз). Вектора удобно заключать в классы с переопределенными операциями.

GluLookAt(e. x,e. y,e. z, c. x,c. y,c. z, u. x,u. y,u. z );

Основной цикл включает в себя следующие этапы рисования кадра:

    1. Очистку буферов от рисования предыдущей картинки 2. Функции рисования примитивов 3. Функции завершения рисования и ожидания ответа видеокарты 4. Функции копирования изображения из памяти на экран

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

Если вы работаете в Visual C, то это осуществляется при помощи функций, прототипы которых описаны в файле glaux. h :

AuxMouseFunc()

AuxKeyFunc()

AuxReshapeFunc()

Если вы работаете в Borland C, то обработка событий осуществляется традиционным для созданных этой программной средой образом: вы просто выбираете компонент(например, Button1), создаете обработчик (например нажатие клавиши) и внутри описываете тело функции.

Похожие статьи




Введение - Библиотека OpenGL

Предыдущая | Следующая