Подключение OpenGL в QT

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

И так... Поехали.

Наиболее удобный вариант подключения - использовать "штатные" средства QT. Разумеется, есть и другие варианты - Glut (FreeGlut), Glaux (только для Windows), glu и т.д. - но, во первых, они не из самых простых, а во вторых - они не для ООП (объектно-ориентированного программирования (можно пытаться извращаться, но до добра редко приводит - например, в качестве callback’а метод вряд ли получится использовать) ).

Для подключения OpenGL к проекту, сначала надо прописать у *pro файл следующее:

QT += opengl
 

Теперь создадим класс, который будет выводить 3D изображение. Он должен быть наследником QGLWidget:

#include <QGLWidget>
#include <GL/gl.h>

class WOpengl: public QGLWidget { public: WOpengl(); };

Теперь переопределим методы

void initializeGL();
void resizeGL(int nWidth, int nHeight);
void paintGL();

Первый метод вызывается при инициализации окна, второй - при изменении размеров окна, третий - "рабочий" - в нем сама процедура отрисовки.

Примеры переопределенных методов:

voidWOpengl::initializeGL()
{

//Задаем цвет фона в OpenGL окне qglClearColor(Qt::black);

//Задаем режим обработки полигонов - переднюю и заднюю часть, //полигоны полностью закрашенные //(а можно просто рамку отображать) glPolygonMode(GL_FRONT_AND_BACK,GL_FILL); }

void WOpengl::resizeGL(int nWidth, int nHeight) {

//Устанавливаем точку обзора. Последние два параметры одинаковы - // чтобы не нарушать пропорции у широких экранов //(можете поэкспериментировать) glViewport(0, 0, nHeight, nHeight);

//Устанавливаем режим матрицы glMatrixMode(GL_PROJECTION);

//Загружаем матрицу glLoadIdentity(); }

void WOpengl::paintGL() { //Очищаем экран glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

//Задаем режим матрицы glMatrixMode(GL_PROJECTION);

//Загружаем матрицу glLoadIdentity();

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

//выводим на экран swapBuffers(); }

Теперь осталось описать функцию, которая что-то рисует. Например,

void WOpengl::scene()
{
  //Задаем цвет изображения
 qglColor(Qt::green);

//Начинаем отрисовку, аргумент означает отрисовку прямоугольника. //Каждый вызов glVertex3f задает одну вершину прямоугольника glBegin(GL_QUADS); glVertex3f(0.51, 0.51, 0.51); glVertex3f(-0.51, 0.51, 0.51); glVertex3f(-0.51, -0.51, 0.51); glVertex3f(0.51, -0.51, 0.51); glEnd(); }

И так... Пока что все. В результате имеем 3D окошко с отрисованым прямоугольником.

3DВ следующей заметке научимся вращать сцену.

Исходники готового проекта можно взять здесь: simple_3D