web-dev-qa-db-fra.com

Comment rendre un triangle dans QOpenGLWidget?

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!

13
5nefarious

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

enter image description here

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.

enter image description here

et c'est le résultat que vous devriez obtenir

enter image description here

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
28
CroCo