J'essaie d'utiliser OpenGL à l'intérieur de Qt en utilisant QOpenGLWidget, mais j'ai du mal à trouver des exemples pertinents. Je suis nouveau sur OpenGL, donc j'essaie d'apprendre à l'utiliser, mais les tutoriels que je trouve ne semblent pas s'appliquer particulièrement bien dans QOpenGLWidget. Pour le moment, tout ce que je veux faire, c'est commencer par rendre un triangle.
Voici ce que j'ai jusqu'à présent.
Entête:
namespace Ui {
class Widget;
}
class Widget : public QOpenGLWidget, protected QOpenGLFunctions
{
public:
explicit Widget(QWidget *parent = 0);
~Widget();
protected:
void initializeGL();
void resizeGL(int, int);
void paintGL();
private:
Ui::Widget *ui;
};
Classe:
Widget::Widget(QWidget *parent) :
QOpenGLWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
}
void Widget::initializeGL()
{
// Set up the rendering context, load shaders and other resources, etc.:
initializeOpenGLFunctions();
glClearColor(0.1f, 0.1f, 0.1f, 1.0f);
}
void Widget::resizeGL(int w, int h)
{
// Update projection matrix and other size-related settings:
}
void Widget::paintGL()
{
// Draw the scene:
glClear(GL_COLOR_BUFFER_BIT);
}
Widget::~Widget()
{
delete ui;
}
Existe-t-il un exemple que je pourrais utiliser pour rendre simplement un triangle de base? J'ai essayé celui d'ici: https://www.khronos.org/assets/uploads/books/openglr_es_20_programming_guide_sample.pdf , mais cela a jeté beaucoup d'erreurs que je n'ai pas pu résoudre.
Je ne sais pas non plus comment les contextes OpenGL fonctionnent dans QOpenGLWidget.
* EDIT: Il s'avère donc que les exemples étaient un package séparé sur ma distribution (Arch Linux). J'ai pu les installer et il semble qu'il y en ait beaucoup pour commencer.
Merci de votre aide!
Si vous voulez utiliser QOpenGLWidget
pas QGLWidget
, alors c'est la façon de le faire.
Ouvrez Qt Creator et choisissez Qt Widgets Application. Ajouter un widget et un bouton poussoir comme suit
main.cpp
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
Ajoutez maintenant une nouvelle classe et nommez-la OGLWidget
qui devrait être héritée de QOpenGLWidget
oglwidget.h
#ifndef OGLWIDGET_H
#define OGLWIDGET_H
#include <QWidget>
#include <QOpenGLWidget>
#include <gl/GLU.h>
#include <gl/GL.h>
class OGLWidget : public QOpenGLWidget
{
public:
OGLWidget(QWidget *parent = 0);
~OGLWidget();
protected:
void initializeGL();
void resizeGL(int w, int h);
void paintGL();
};
#endif // OGLWIDGET_H
oglwidget.cpp
#include "oglwidget.h"
OGLWidget::OGLWidget(QWidget *parent)
: QOpenGLWidget(parent)
{
}
OGLWidget::~OGLWidget()
{
}
void OGLWidget::initializeGL()
{
glClearColor(0,0,0,1);
glEnable(GL_DEPTH_TEST);
glEnable(GL_LIGHT0);
glEnable(GL_LIGHTING);
glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE);
glEnable(GL_COLOR_MATERIAL);
}
void OGLWidget::paintGL()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glBegin(GL_TRIANGLES);
glColor3f(1.0, 0.0, 0.0);
glVertex3f(-0.5, -0.5, 0);
glColor3f(0.0, 1.0, 0.0);
glVertex3f( 0.5, -0.5, 0);
glColor3f(0.0, 0.0, 1.0);
glVertex3f( 0.0, 0.5, 0);
glEnd();
}
void OGLWidget::resizeGL(int w, int h)
{
glViewport(0,0,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45, (float)w/h, 0.01, 100.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0,0,5,0,0,0,0,1,0);
}
Revenez maintenant au formulaire et faites un clic droit sur le widget. Sélectionnez widgets promus et saisissez le nom de la classe promue OGLWidget. Appuyez sur le bouton Ajouter, puis faites la promotion. Maintenant, cliquez sur l'arrière-plan et accédez à ses propriétés et changez windowModality en ApplicationModel.
et c'est le résultat que vous devriez obtenir
les .pro
le fichier est
#-------------------------------------------------
#
# Project created by QtCreator 2015-07-20T15:15:29
#
#-------------------------------------------------
QT += core gui opengl
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = test2
TEMPLATE = app
SOURCES += main.cpp\
mainwindow.cpp \
oglwidget.cpp
HEADERS += mainwindow.h \
oglwidget.h
FORMS += mainwindow.ui