2015-07-20 74 views
7

我想使用QO使用QOpenGLWidget OpenGL,但我很難找到任何相關的例子。我是OpenGL的新手,所以我正在嘗試學習如何使用它,但是我發現這些教程在QOpenGLWidget中似乎並不適用。現在,我想要做的就是渲染一個三角形。如何在QOpenGLWidget中渲染三角形?

這是我到目前爲止。

頁眉:

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

類:

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

有沒有我可以用它來只呈現一個基本的三角任何的例子嗎?我試過這個:https://www.khronos.org/assets/uploads/books/openglr_es_20_programming_guide_sample.pdf,但是它拋出了很多我無法解決的錯誤。

我也不知道OpenGL上下文在QOpenGLWidget中是如何工作的。

*編輯:事實證明,這些例子是我的發行版(Arch Linux)上的一個單獨的軟件包。我能夠安裝它們,而且看起來有很多東西可以開始使用。

感謝您的幫助!

+0

您是否嘗試過學習所附帶的GL(ES)的例子Qt的? QOpenGLWidget沒有什麼特別之處。 – peppe

+0

我在哪裏可以找到這些例子? – inefarius

+2

它們與Qt一起發貨。 OpenGL部分。 http://doc.qt.io/qt-5/examples-widgets-opengl.html – peppe

回答

19

如果你想使用QOpenGLWidget而不是QGLWidget,那麼這是做到這一點的方法。

打開Qt Creator並選擇Qt Widgets Application。添加小組件和按鈕如下

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 

現在,添加新的類並將其命名爲OGLWidget應從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); 
} 

繼承現在回到表格,在小部件上點擊右鍵。選擇提升的部件並鍵入升級的類名稱OGLWidget。點擊添加按鈕,然後升級。現在單擊背景並轉到其屬性,並將windowModality更改爲ApplicationModel。

enter image description here

,這是結果,你應該得到

enter image description here

.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

感謝您的非常詳細的回覆。雖然不是glBegin和glEnd不推薦使用?另外,是否需要GLU? – inefarius

+0

這僅僅是一個例子。 Qt有一些例子,如果你想要更多的細節。 – CroCo

+2

這不顯示如何使用QOpenGLWidget中的功能。如果你選擇像這樣使用OpenGL,那麼在我看到的QOpenGLWidget的子類化中就沒有任何用處。 – steventaitinger