Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
16
Добавлен:
07.02.2016
Размер:
2.53 Mб
Скачать

Лабораторная работа №1

1 ТЕОРЕТИЧЕСКАЯ ЧАСТЬ

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

На базовом уровне, OpenGL — это просто спецификация, то есть документ, описывающий набор функций и их точное поведение. Производители оборудования на основе этой спецификации создают реализации — библиотеки функций, соответствующих набору функций спецификации. Реализация призвана эффективно использовать возможности оборудования. Если аппаратура не позволяет реализовать какую-либо возможность, она должна быть эмулирована программно. Производители должны пройти специфические тесты (conformance tests — тесты на соответствие) прежде чем реализация будет классифицирована как OpenGL-реализация. Таким образом, разработчикам программного обеспечения достаточно научиться использовать функции, описанные в спецификации, оставив эффективную реализацию последних разработчикам аппаратного обеспечения.

Существует ряд библиотек, созданных поверх или в дополнение к OpenGL. Например, библиотека GLU, являющаяся практически стандартным дополнением OpenGL и всегда её сопровождающая, построена поверх последней, то есть использует её функции для реализации своих возможностей. Другие библиотеки, как, например, GLUT и SDL, созданы для реализации возможностей, недоступных в OpenGL. К таким возможностям относятся создание интерфейса пользователя (окна, кнопки, меню и др.), настройка контекста рисования (область рисования, использующаяся OpenGL), обработка сообщений от устройств ввода/вывода (клавиатура, мышь и др.), а также работа с файлами. Обычно, каждый оконный менеджер имеет собственную библиотеку-расширение для реализации вышеописанных возможностей, например, WGL в Windows или GLX в X Window System, однако библиотеки GLUT и SDL являются кросс-платформенными, что облегчает перенос написанных приложений на другие платформы.

2 ПРИМЕР ПРОГРАММЫ

Создаем новый проект в QT 5.1.1:

Выбираем – Приложения -> GUI приложение Qt -> Далее. Вводим имя проекта, например Test_OpenGL_Laba_1, выбираем путь к расположению проекта и нажимаем Далее:

Здесь по желанию можно задать новое имя класса, или оставить стандартное:

Завершаем создание проекта:

Получим следующий проект с файлами:

Т.к. мы работаем с OpenGL нам нужно прописать в файле Test_OpenGL_Laba_1.pro следующее:

Нам понадобится дополнительный класс – поэтому создадим его:

Нажимаем правой кнопкой мышки на Test_OpenGL_Laba_1 и выбираем Добавить новый:

Выбираем: С++ -> Класс С++.

Вводим данные – название моего класса будет My_Paint , вводим название базового класса QGLWidget:

Добавив класс заходим в файлик my_paint.h и вместо выделенного текста на рисунке:

Добавляем следующее:

public:

My_Paint();

void initializeGL();

void paintGL();

void resizeGL(int w, int h);

Получим вот такое:

Далее переходим в my_paint.срр :

Изменяем описание класса на:

My_Paint::My_Paint(){}

Подключаем библиотеки:

#include <QtOpenGL>

#include <GL/gl.h>

И прописываем следующее:

void My_Paint::initializeGL(){}

void My_Paint::paintGL(){}

void My_Paint::resizeGL(int w, int h){ }

Получим:

Далее заходим на формочку mainwindow.ui:

Удалим всё лишнее, оставив только QWidget:

Далее я добавим 2е кнопки (PushButton) – одна нужна будет для «Выхода», вторая - для запуска программы на рисование, а так же добавим текст (TextLabel), изменю их текст, размер и шрифт и получу следующее:

Далее для кнопочки «Выход» выбираем Изиенение сигналов слотов и проводим стрелку:

После откроется окно на котором нужно выбрать следующее – Clicked() – Close():

Получим следующее:

Затем нажимаем Изменение виджетов (F3).

Запустив программу получим:

Нажимаем выход и для активации кнопки «Нарисовать» – делаем следующее:

Заходим в mainwindow.h :

Вставляем:

private slots:

void on_pushButton_clicked();

Заходим в mainwindow.срр:

Добавляем:

#include "my_paint.h"

И прописываем функцию:

void MainWindow::on_pushButton_clicked()

{

My_Paint *opengl_window = new My_Paint;

opengl_window->show();

}

Далее переходим в my_paint.срр :

Далее добавляем еще функцию в my_paint.h:

void scene();

Вносим код в наши функции:

void My_Paint::initializeGL()

{

//Выбрать фоновый (очищающий) цвет

glClearColor(1.0,0.84,0.0,1.0);//glClearColor(r,g,b,t); Где, r-красный цвет, g-зеленый, b- голубой, t-прозрачность.

//Задаем режим обработки полигонов - переднюю и заднюю часть,

//полигоны полностью закрашенные

//(а можно просто рамку отображать)

glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);

}

void My_Paint::resizeGL(int nWidth, int nHeight)

{

//Устанавливаем точку обзора. Последние два параметры одинаковы -

// чтобы не нарушать пропорции у широких экранов

//(можете поэкспериментировать)

glViewport(0, 0, nWidth, nHeight);

//Устанавливаем режим матрицы

glMatrixMode(GL_PROJECTION);

//Загружаем матрицу

glLoadIdentity();

}

void My_Paint::paintGL()

{

//Очищаем экран

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

//Установить проекцию:

//Задаем режим матрицы

glMatrixMode(GL_PROJECTION);

//Загружаем матрицу

glLoadIdentity();

glOrtho(0.0,600.0,0.0,400.0,-1.0,1.0);

//Здесь рисуем - для удобства в отдельной функции

scene();

//выводим на экран

swapBuffers();

}

void My_Paint::scene()

{

//Задаем цвет изображения

qglColor(Qt::red);

//Начинаем отрисовку, аргумент означает отрисовку прямоугольника.

//Каждый вызов glVertex3f задает одну вершину прямоугольника

glBegin(GL_POLYGON);

glVertex3f(50.0,350.0,0.0); //Координаты квадрата

glVertex3f(250.0,350.0,0.0);

glVertex3f(250.0,150.0,0.0);

glVertex3f(50.0,150.0,0.0);

glEnd();

//Стрелка вверх

glColor3f(0.0,0.75,1.0); //Выбираем голубой цвет

glBegin(GL_POLYGON);

glVertex3f(400.0,275.0,0.0); //Координаты треугольника

glVertex3f(475.0,375.0,0.0);

glVertex3f(550.0,275.0,0.0);

glEnd();

glBegin(GL_POLYGON);

glVertex3f(435.0,275.0,0.0); //Координаты квадрата

glVertex3f(515.0,275.0,0.0);

glVertex3f(515.0,175.0,0.0);

glVertex3f(435.0,175.0,0.0);

glEnd();

//Стрелка влево

glColor3f(0.0,0.75,1.0); //Выбираем голубой цвет

glBegin(GL_POLYGON);

glVertex3f(350.0,25.0,0.0); //Координаты треугольника

glVertex3f(250.0,100.0,0.0);

glVertex3f(350.0,175.0,0.0);

glEnd();

glBegin(GL_POLYGON);

glVertex3f(350.0,140.0,0.0); //Координаты квадрата

glVertex3f(525.0,140.0,0.0);

glVertex3f(525.0,70.0,0.0);

glVertex3f(350.0,70.0,0.0);

glEnd();

}

И запускаем программу:

Нажимаем «Нарисовать» и получаем еще одно окно:

Нажимаем на крестик и после на первой формочке «Выход».

Соседние файлы в папке lab1