QT5.7中的opengl使用方法

本文目的是记录一下自己搜索相关机制的结果

qt5.7实现opengl机制主要包含两类

一种是提供QtGui实现,这个库主要是通过QWindow结合qt封装的opengl库进行实现,官方有案例,一个旋转的三角形,使用opengl es2.0,而且这也是qml的底层实现方式。另一种是通过QWidget中的qopenglwidget类实现的,这里保留了早期的qopengl方法,即对应于opengl2.0版本的封装,也保留了新的方法,在opengl2.0版本之后,传统固定管线被舍弃,从opengl3.0 开始,使用的主流方法都是可编程管线,即对应于着色器的编程,实现更灵活,同时增加了一定的学习曲线。

qt5.7 的opengl功能

QOpenGLFunctions 里面包含opengl es2.0的内容,同时他也提供了opengl es3.0的API,对opengl的支持也到最新的4.3版本,可以从QtGui类库中看到,根据实际需求使用opengl的不同版本。需要说明的是qt只是针对opengl函数进行了封装,对本身的性能并没有太大影响,还是由版本和具体实现决定。

qt使用opengl例子

1 直接使用opengl窗口,这里使用可以参考官方三角形demo,需要自己写顶点着色器和片段着色器,下面时官方使用的一个例子,可以看到是通过继承opengl函数的方式覆写绘图函数进行使用的。

#include <QtGui/QWindow>
#include <QtGui/QOpenGLFunctions>

QT_BEGIN_NAMESPACE
class QPainter;
class QOpenGLContext;
class QOpenGLPaintDevice;
QT_END_NAMESPACE

//! [1]
class OpenGLWindow : public QWindow, protected QOpenGLFunctions
{
    Q_OBJECT
public:
    explicit OpenGLWindow(QWindow *parent = 0);
    ~OpenGLWindow();

    virtual void render(QPainter *painter);
    virtual void render();

    virtual void initialize();

    void setAnimating(bool animating);

public slots:
    void renderLater();
    void renderNow();

protected:
    bool event(QEvent *event) Q_DECL_OVERRIDE;

    void exposeEvent(QExposeEvent *event) Q_DECL_OVERRIDE;

private:
    bool m_update_pending;
    bool m_animating;

    QOpenGLContext *m_context;
    QOpenGLPaintDevice *m_device;
};

2 考虑到很多程序是基于widget组件实现的,我们不仅仅想要一个窗口,考虑下面两种方式利用opengl,一种方法是利用前面的window,将写好的window作为widget添加到容器中,这里也支持mdi等容器组件,这种方法的限制是一旦作为widget,本身窗体的一些功能就无法使用,通过widget来进行管理组件。它的好处是比较轻便,更贴近底层,不需要QWidget这个笨重的库,具体还是根据需求来定

 DisplayWindow *window = new DisplayWindow();
 window->setAnimating(true);
 QWidget * widget = QWidget::createWindowContainer(window);
 ui->gridLayout->addWidget(widget);

另一种方法是利用QOpenGLWidget,也可以实现,查看帮助文档说明了我们书写opengl内容的区域和需要重写的函数,我们可以简单通过继承来使用不同版本的opengl。

要想使用qt的opengl功能,还需要掌握shader和基本的opengl编程方法,而且对于鼠标键盘的事件交互可以直接使用qt本身的封装进行交互。考虑直接使用opengl,我们实际上会利用opengl的扩展库,不如glut,glew等,qt实际上是对这些库的重新封装,整合到它自己的GUI框架下,然后我们可以直接使用opengl,对于已经有过相关经验的,相信入门比较容易。

仅仅是个人mark一下,有错误请指出。


版权声明:本文为w13362801880原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。