Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ИГС / 5_i_poslednyaya / glopen10 / Labor_07.doc
Скачиваний:
22
Добавлен:
29.05.2018
Размер:
416.26 Кб
Скачать

37

Московский институт электронной техники

Кафедра ИПОВС

Лабораторная работа 07

Графическая библиотека OpenGL.

Содержание

1. Введение _________________________________________________ стр. 1.

2. Подключение графической библиотеки OpenGL в программах Win32 стр. 3.

3. Создание проекта в VC++ с подключением библиотеки OpenGL стр. 5

4. Консольное приложение Windows для работы с OpenGL стр. 7.

5. Интерактивное взаимодействие с OpenGL в оконном режиме Windows, стр. 8.

6. Двойная буферизация стр.11.

7. Двойная буферизация OpenGL в оконном приложении Windows стр. 12.

8. Двойная буферизация OpenGL в консольном приложении Windows стр. 13.

9. Создание 2D объектов с помощью OpenGL стр. 15

10. Пример создания 3D объектов с помощью OpenGL стр. 17

11. Использование таймера для моделирования движения 3D-объектов OpenGL в оконном приложении Windows стр. 19

11. Моделирование движения 3D-объектов OpenGL без таймера в консольном приложении Windows стр. 21

11. Задания стр. 22

Введение.

В работе изучаются методы построения реалистических трехмерных графических объектов. Алгоритмы 3D графики рассматриваются с применением графической библиотеки OpenGL в программах Win32. Поэтому в начале описываются способы подключения библиотеки OpenGL в программах на C++ для системы Windows. Затем рассматриваются графические примитивы 2D и 3D графики библиотеки OpenGL. После этого даются примеры построения 3D графических объектов с использованием некоторых алгоритмов 3D графики.

Подключение графической библиотеки OpenGl в программах Win32.

Рассмотрим простую программу рисующую треугольник с помощью библиотеки OpenGL. На примере этой программы посмотрим, как подключается библиотека OpenGL, и как создаются простейшие графические объекты с помощью функций этой библиотеки.

Пусть код программы находится в файле glopen01.cpp. Выделим несколько основных пунктов.

1. Во-первых, надо подключить заголовочные файлы gl.h, glu.h библиотеки OpenGL. Ниже приводится фрагмент соответствующего кода.

#include <windows.h>

#include <windowsx.h>

#include <gl\gl.h>

#include <gl\glu.h>

2. Во-вторых, надо установить стиль окна WS_CLIPCHILDREN | WS_CLIPSIBLINGS в функции CreateWindow. Ниже приводится фрагмент соответствующего кода.

//создание главного окна программы

HWND CreateApp(HINSTANCE hInstance, int nCmdShow)

{

HWND hwnd; //дескриптор главного окна программы

hwnd = CreateWindow(szClassName, //имя класса окна 

szWindowTitle, //заголовок окна 

WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN

| WS_CLIPSIBLINGS, //стиль окна

CW_USEDEFAULT, //положение и размеры окна 

CW_USEDEFAULT,

CW_USEDEFAULT,

CW_USEDEFAULT,

NULL,

NULL,

hInstance,

NULL);

if(hwnd == NULL)

return hwnd;

//рисуем окно

ShowWindow(hwnd,nCmdShow);

//обновляем окно

UpdateWindow(hwnd);

return hwnd;

}

3. В-третьих, надо получить контекст отображения для OpenGL. В контексте отображения (rendering context), функции библиотеки OpenGL будут рисовать графические объекты.

Перед получением контекста отображения надо провести некоторые действия по установке нужного формата пикселей. Для этого надо заполнить поля структуры PIXELFORMATDESCRIPTOR. Например, указать, сколько бит выделяется на один пиксель. Затем надо проверить, поддерживает ли видеоаппаратура компьютера выбранный формат пикселей. Для этого служит функция ChoosePixelFormat, которая выдает номер формата, поддерживаемый аппаратурой, наиболее близкий к выбранному формату.

После этого получают контекст отображения, связанный с контекстом окна программы. И, наконец, устанавливают текущий контекст отображения OpenGL. Далее можно рисовать 2D и 3D объекты с помощью функций графической библиотеки OpenGL. Ниже приводится фрагмент соответствующего кода, где производятся все указанные выше действия.

//рисуем графические объекты

void DrawOpenGL(HWND hwnd)

{

HDC hdc = GetDC(hwnd); //получаем контекст окна

//рисуем прямоугольник, используя GDI

Rectangle(hdc,100,200,500,250);

//П О Д К Л Ю Ч А Е М OpenGL

//структура описания формата пикселя

PIXELFORMATDESCRIPTOR pfd;

//зануляем все поля структуры pfd

memset(&pfd, 0, sizeof(PIXELFORMATDESCRIPTOR));

//заполняем некоторые поля структуры

pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR);

pfd.nVersion = 1;

pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_DRAW_TO_BITMAP | PFD_SUPPORT_OPENGL;

pfd.iPixelType = PFD_TYPE_RGBA;

pfd.cColorBits = 24;

//выбираем наиболее подходящий формат пикселей

//среди форматов содержащихся в контексте окна hdc

int iPixelFormat = ChoosePixelFormat(hdc, &pfd);

//устанавливаем найденный формат пикселей в контексте окна

SetPixelFormat(hdc, iPixelFormat, &pfd);

//получаем контекст отображения OpenGL

HGLRC hglrc = wglCreateContext(hdc);

//устанавливаем текущий контекст отображения OpenGL

wglMakeCurrent(hdc, hglrc);

//устанавливаем двухмерную ортогональную область просмотра

gluOrtho2D(-400, 400, -300, 300);

//устанавливаем текущий цвет

glColor3f(0.0, 1.0, 0.0);

//рисуем треугольник

glBegin(GL_TRIANGLES);

glVertex2f(-100, -100);

glVertex2f(0, 100);

glVertex2f(100, -100);

glEnd();

//устанавливаем текущий цвет

glColor3f(1.0, 0.0, 0.0);

//толщина линий - 6 пикселей

glLineWidth(6.0);

//рисуем связанную группу отрезков

glBegin(GL_LINE_STRIP);

glVertex2f(0, 150);

glVertex2f(150, -130);

glVertex2f(-150, -130);

glVertex2f(0, 150);

glEnd();

//завершаем работу с текущим контекстом отображения

wglMakeCurrent(NULL, NULL);

//освобождаем контекст отображения OpenGL

wglDeleteContext(hglrc);

//OpenGL О Т К Л Ю Ч Е Н

//рисуем прямоугольник, используя GDI

Rectangle(hdc,50,220,450,270);

//освобождаем контекст окна

ReleaseDC(hwnd,hdc);

}

В этом фрагменте кода обратим внимание на заполнение полей структуры PIXELFORMATDESCRIPTOR. Эта структура имеет 26 полей. Вначале обнуляются все поля с помощью функции memset. Затем заполняем некоторые поля этой структуры.

- В поле nSize находится размер структуры.

- В поле nVersion находится номер версии, для текущей версии надо положить номер равный 1.

- В поле dwFlags находится множество битовых флагов, определяющих устройство и интерфейс, с которым совместим формат пикселей, флаг PFD_DRAW_TO_WINDOW означает, что разрешено рисование в окне, PFD_SUPPORT_OPENGL – флаг, который поддерживает рисование OpenGL.

- Поле PFD_TYPE_RGBA определяет режим, используемый для изображения цветов. Флаг PFD_TYPE_RGBA означает, что цвет каждого пикселя определяется четырьмя значениями: красным, зеленым, синим и альфа. Четвертый параметр цвета альфа определяет степень прозрачности графического объекта, 0.0 подразумевает полную прозрачность, 1.0 – полную непрозрачность.

- В поле cColorBits находится число бит, выделяемых на описание цвета пикселя.

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

Контекст отображения для OpenGL, связанный с контекстом окна создается функцией wglCreateContext. Созданный контекст отображения, устанавливается как текущий контекст отображения, с помощью функции wglMakeCurrent.

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

После создания графических объектов контекст отображения и контекст окна необходимо освободить. Это выполняется следующим образом. Для завершения работы с текущим контекстом отображения используем функцию wglMakeCurrent с нулевыми параметрами. Затем освобождаем контекст отображения с помощью функции wglDeleteContext. И, наконец, освобождаем контекст окна с помощью функции ReleaseDC.

Обратим внимание на одну деталь приведенного фрагмента кода. Здесь показана возможность использования в одном окне как графических функций API Win32, так и функций библиотеки OpenGL. После получения контекста окна, до получения контекста отображения, рисуется прямоугольник с помощью функции Rectangle, которая является функцией API Win32. Затем получаем контекст отображения и рисуем в окне графические фигуры с помощью функций OpenGL. После освобождения контекста отображения, но до освобождения контекста окна снова рисуем прямоугольник.

Результат работы программы показан на Рис.1.

Рис.1.

Прямоугольники нарисованы функциями API, треугольники функциями OpenGL.

(Изображение на Рис.1 создано программой glopen01.cpp.)

На этом рисунке видна последовательность появления на экране фигур нарисованных функциями API Win32 и функциями OpenGL.

Создание проекта в VC++ с подключением графической библиотеки OpenGL.

Чтобы программа glopen01.cpp заработала, необходимо создать проект и подключить к нему файл glopen01.cpp, с рассмотренным кодом. Если создание проекта выполняется с помощью компилятора Visual C++, то объявление заголовочных файлов gl.h, glu.h библиотеки OpenGL в начале программы оказывается недостаточным для создания исполняемого модуля. Приходится вручную подключить к проекту библиотечные файлы opengl32.lib, glu32.lib библиотеки OpenGL. Кроме файла glopen01.cpp к проекту надо также подключить файл ресурсов glopen01.rc. Ниже приводится код, содержащийся в этом файле ресурсов.

GLMENU MENU

{

POPUP "&Файл"

{

MENUITEM "&Очистить", 200

MENUITEM SEPARATOR

MENUITEM "&Закончить", 201

}

MENUITEM "&Графика", 202

}

Рассмотрим создание проекта. Пусть рабочий каталог Work находится на диске D.

Запустим VISUAL C++ и в главном меню в пункте File пройдем по цепочке: File – New – Project , где выбираем пункт Win32Application . В окне Location указываем путь D:\Work\ , в окне Project name набираем glopen01, нажимаем OK.

Далее выбираем пункт An empty project, нажимаем Finish и нажимаем OK.

После этого в каталоге D:\Work появится подкаталог glopen01. Поместим в этот каталог D:\Work\glopen01 файлы glopen01.cpp, glopen01.rc, и продолжим создавать проект.

В главном меню слева имеется окно (Workspace) у которого внизу две надписи ClassView и FileView. Выбираем FileView и вверху слева щелкаем по плюсу +.

Подводим мышку к надписи Source files и щелкаем правой кнопкой. В появившемся маленьком меню выбираем пункт Add Files to Folder . Указываем путь к файлу glopen01.cpp, в рассматриваемом случае этот путь следующий D:\Work\glopen01\. Подсоединяем файл glopen01.cpp к проекту. В результате у пункта Source files появится плюс +.

Подводим мышку к надписи Resource files и щелкаем правой кнопкой. В появившемся маленьком меню выбираем пункт Add Files to Folder . Указываем путь к файлу ресурсов glopen01.rc, в рассматриваемом случае этот путь следующий D:\Work\glopen01\. Подсоединяем файл ресурсов glopen01.rc к проекту. В результате у пункта Resource files появится плюс +.

Щелкнем левой кнопкой мыши по плюсу у пункта Source files, и затем двойным щелчком левой кнопкой откроем файл glopen01.cpp в окне редактирования.

В главном меню в пункте Project пройдем по цепочке: Project – Properties – Configuration Properties. Выбираем пункты Linker – Command Line , и в окне Additional options, добавим библиотечные файлы opengl32.lib, glu32.lib библиотеки OpenGL. После щелчка OK компилятор VC++ будет настроен нужным образом.

Для компиляции программы в пункте Build выберем строку Compile glopen01.cpp. Если компиляция прошла успешно, то в пункте Build выберем строку Build glopen01.exe, выполняем компоновку, и создаем исполняемый файл glopen01.exe. Запускаем программу и получаем картину, показанную на Рис.1.