2015-07-20 21 views
7

Sto provando ad usare OpenGL all'interno di Qt usando QOpenGLWidget, ma sto facendo fatica a trovare qualche esempio pertinente. Sono nuovo di OpenGL, quindi sto cercando di imparare come usarlo, ma le esercitazioni che trovo non sembrano applicarsi particolarmente bene in QOpenGLWidget. In questo momento, tutto ciò che voglio fare è rendere un triangolo con cui iniziare.Come si esegue il rendering di un triangolo in QOpenGLWidget?

Ecco quello che ho finora.

Intestazione:

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; 
} 

C'è un esempio che io uso per rendere solo un triangolo di base? Ho provato quello da qui: https://www.khronos.org/assets/uploads/books/openglr_es_20_programming_guide_sample.pdf, ma ha gettato un sacco di errori che non ho potuto risolvere.

Inoltre non so come funzionano i contesti OpenGL in QOpenGLWidget.

* EDIT: Così si scopre che gli esempi erano un pacchetto separato sulla mia distro (Arch Linux). Sono stato in grado di installarli, e sembra che ci sia molto da fare per iniziare.

Grazie per il vostro aiuto!

+0

Hai provato a studiare gli esempi GL (ES) che vengono spediti con Qt? Non c'è nulla di particolare in QOpenGLWidget. – peppe

+0

Dove posso trovare questi esempi? – inefarius

+2

Sono spediti con Qt. Sezione OpenGL. http://doc.qt.io/qt-5/examples-widgets-opengl.html – peppe

risposta

19

Se si desidera utilizzare QOpenGLWidget non QGLWidget, allora questo è il modo per farlo.

Aprire Qt Creator e selezionare Qt Widgets Application. Aggiungi Widget e premere il pulsante come segue

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 

Ora Inserisci nuova classe e il nome OGLWidget che dovrebbe essere ereditato da 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); 
} 

Ora torna al modulo e fare clic destro sul widget. Selezionare widget promossi e digitare il nome della classe promossa OGLWidget. Premi il pulsante Aggiungi e quindi promuovi. Ora fai clic sullo sfondo e vai alle sue proprietà e modifica windowModality in ApplicationModel.

enter image description here

e questo è il risultato che si dovrebbe ottenere

enter image description here

il file .pro è

#------------------------------------------------- 
# 
# 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 
+0

Grazie per la risposta molto dettagliata. Non sono forse glBegin e GlEnd deprecati? Inoltre, è richiesto GLU? – inefarius

+0

Questo è solo un esempio. Qt ha alcuni esempi nel caso in cui desideri maggiori dettagli. – CroCo

+2

Questo non mostra come utilizzare la funzionalità in QOpenGLWidget. Se si sceglie di utilizzare OpenGL come questo non ci sarebbe alcuno scopo nella sottoclasse di QOpenGLWidget che posso vedere. – steventaitinger