QT下opengl(认识)

虽然Qt不以效率著称,但是事实上有足够的优化,最最典型的就是默认的图形双缓冲,按照Windows下的编程惯例是需要手动开启,并通过额外的接口调用才能使用的,这一点在以前简单图形编程学习时比较过Qt,Win32 GDI时感受特别深刻,在没有额外处理的时候,Win32动画程序那个闪阿,而Qt程序非常稳定。事实上,我想,Qt的其他问题比效率严重多了,比如个人感觉,这点倒是值得改进。
OpenGL只处理与3D图形的绘制,基本上不提供创建用户界面的功能,所以为OpenGL应用程序创建用户界面必须使用其它的图形工其包(如Motif、MFC等)。而Qt的OpenGL模块很好的解决了这个问题,它提供了一个继承自Qwidget的OpenGL部件类QGLWidget,使得该部件类能够像Qt其它部件那样使用,还可以在绘制窗口部件时直接使用OpenGL的API接口。在Qt中为OpenGL提供支持的类主要有以下几个:

  • QGLWidget:用于渲染OpenGL场景的易于使用的Qt部件。

  • QGLColormap:用于在QGLWidget中安装用户自定义的颜×××。

  • QGLContext:封装了用于OpenGL渲染的场景。

  • QGLFormat:指定OpenGL演染场景的显示模式。

  • QGLFrameBufferObject和QGLPixelBuffer分别提供了对GL帧缓冲对象和GL像素缓冲的支持。

  • QGLPaintEngine:QPaintEngine的派生类,为QPainter提供了OpenGL绘图引擎。

  • initializeGL() 注册函数,在此设置GL的渲染绘制属性、定义显示列表、载入固定纹理等初始化工作。在initializeGL()在调用paintGL()之前只被调用一次,之后不再调用。

  • paintGL() 绘制函数,在此使用OpenGL中的接口进行场景绘制,QGLWidget的paintEvent( QPaintEvent* )将会自动调用 paintGL()进行部件的显示绘制。也可在需要重绘时通过updateGL()时调用paintGL()。

  • resizeGL() 该函数用于处理当部件大小发生改变时,对OpenGL绘图管线各矩阵需要进行的操作。该函数paintGL()第一次调用之前,initializeGL()调用之后被第一次被调用, 之后每当QGLWidget的不见大小发生改变时,都将调用该函数来对视图、投影矩阵等进行相应的设置。


 

这样就完成了一个利用OpenGL绘制矩形的任务,paintGL中调用的完全是普通的OpenGL函数,一如我们学过的普通OpenGL函数,没有区别。其中最主要的代码就在OpenGL::paintGL()中,这一点需要额外注意,那就是此处与普通的Qt程序是不同的,但是,可以想像的是,,Qt可以在外面做好足够的OpenGL准备工作。,一如GLUT抽象出的框架及我在Win32 OpenGL学习时建立的框架一样,知道这些以后,可以将OpenGL在Qt中的编程分成两个部分,一个部分就是由initializeGL,resizeGL,paintGL三个虚接口构成的OpenGL的领域,我们可以在其中进行我们习惯的OpenGL操作,而程序的输入等其他GUI相关的处理则还是交由Qt原来的框架去完成。

OpenGL从Win32到Qt

实际上,在进行二维图形的绘制中,完全可以不使用OpenGL的原生接口而使用更为方便的QPainter。QPainter只是个API,实际的渲染是由QPaintEngine来执行的。Qt自带有QGLPaintEngine,为QPainter提供了OpenGL后台。在QGLWidget基础上创建的QPainter,自动将QGLPaintEngine作为绘画引擎。这样,任何使用此QPainter类型绘制的2D图形都会自动解析至OpenGL,间接以GL的原生接口来实现二维图形的绘制。使用QPainter而不是OpenGL命令的优势是可轻易将渲染在平台默认引擎和OpenGL之间切换。这样不仅可以充分利用二者各自的优势,同时还可以直接使用Qt二维绘图系统所提供的众多高级功能。

Qt 提供了QtOpenGL模块来支持三维图形功能的OpenGL模块。在使用QtOpengl模块时,必须在对应的工程文件(*.箴)中加入:

QT +=opengl

来声明使用QtOpengl模块,以便,qmake 在利用*。箴生成编译器所需的makefile时添加所需的opengl库。

在Qt下使用创建opengl绘图组件主要通过继承QGLWidget并重现相关绘制函数来实现,QGLWidget派生自QWidget,故绝大多数情况下QGLWidget可以像QWidget一样使用,只是使用opengl的函数替代QPainter实现绘制。通常通过子类化QGLWidget来实现opengl的使用,QGLWidget提供了三个虚函数用以重载来实现opengl的绘制:

QT下opengl(认识)