Лабораторные работы №1,2 - Open GL / lab1 / laba1_QT_OpenGL
.docЛабораторная работа №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();
}
И запускаем программу:

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

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