本文目的是记录一下自己搜索相关机制的结果
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一下,有错误请指出。