2015-07-20 76 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