实现Qt和OpenGL混合渲染
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()函数是自己实现了绘制立方体和正三棱锥。大家可以参考一下。但是需要注意的是,进行二维图形和三维图形的混合,有可能会出现无法显示二维、无法显示三维的问题。这些问题是非常棘手的,在上一篇文章中我总结了如何避免失误。
希望我的这篇博客能够有所帮助。