现在的位置: 首页 > 自动控制 > 工业·编程 > 正文

案例:实现Qt和OpenGL混合渲染

2014-06-29 04:21 工业·编程 ⁄ 共 1420字 ⁄ 字号 暂无评论

    Qt自有一个绘图的引擎,这个引擎的核心就是QPainter,我们知道QPainter在渲染二维图形和文字有很大的优势,而OpenGL是当前流行的三维渲染器,怎样才能将两者结合起来,制作更为丰富的应用程序?《C++GUIProgramming with Qt 4,secondedition》这本书给了我们一个小的例子,不过我们还要深入地以这个例子为基础进行挖掘,配合Qt的文档,我们才能真正地了解Qt对OpenGL的封装。

演示程序下载地址:这里

源代码的下载地址:这里

这是我创建的例子截图:

这个例子使用了OpenGL、Qt资源、Qt语言家等。

简单地说,首先我用Qt原生二维渲染引擎QPainter绘制了一个背景图,随后将渲染的上下文转为OpenGL进行渲染,最后在中间显示了文字。当然我们使用了Qt语言家,可以显示任何国家的任何文字,只要机器支持该语言。

下面是我这个类的定义:
#ifndefGLWIDGET_H

#define GLWIDGET_H
#include <QGLWidget>
#include <QPixmap>
class GLWidget : public QGLWidget
{
    Q_OBJECT
public:
    explicit GLWidget(QWidget *parent = 0);
    void initializeGL( void );
    void resizeGL( int width, int height );
    void paintEvent( QPaintEvent *event );

    // 本类的成员函数
    void Init2D( void );
    void Init3D( void );
    void Draw2D( void );
    void Draw3D( void );
    void DrawCube( double length,
                   const QColor topFace,
                   const QColor buttomFace,
                   const QColor leftFace,
                   const QColor rightFace,
                   const QColor frontFace,
                   const QColor backFace );
    void DrawTetrahedron( double length,
                          const QColor sideFace1,
                          const QColor sideFace2,
                          const QColor sideFace3,
                          const QColor buttomFace );
signals:
    
public slots:
private:
    enum { Cube = 0, Tetrahedron, ListCount };
    GLuint          m_List[ListCount];
    QPixmap         m_Background;
    float           m_Angle;
};
#endif // GLWIDGET_H

这里我选择了initializeGL()、resizeGL()和paintGL()三个函数进行重写。这里解释了为什么要选择这些函数。Init2D()和Draw2D()函数用来初始化与二维有关的(也就是QPixmap的初始化),Init3D()和Draw3D()函数用来初始化与三维有关的(也就是四个立方体和文字的渲染)。DrawCube()和DrawTetrahedron()函数是自己实现了绘制立方体和正三棱锥。大家可以参考一下。但是需要注意的是,进行二维图形和三维图形的混合,有可能会出现无法显示二维、无法显示三维的问题。这些问题是非常棘手的,在上一篇文章中我总结了如何避免失误。

作者:jiangcaiyang

给我留言

留言无头像?