浅谈Qt对OpenGL(ES)2.0以及高级OpenGL_API的支持
Qt5相比Qt4有了很大的改变,对OpenGL这一部分支持的力度加大了。如果说Qt5.0对OpenGL这部分的改变还是试验性的,那么Qt5.1中与OpenGL相关的函数和封装则是优化和一些小小的微调。早在Qt5.1还没有发布的时候,国外就有高手发布了Qt5.1对OpenGL支持的相关特性(链接在这里)。
Windows系统是一个固步自封的系统,对OpenGL的官方支持只到OpenGL1.1。还好各大显卡厂商还算有节操,通过替换opengl32.dll成厂商自己的opengl32.dll实现对OpenGL扩展的支持。Linux系统是一个开源的系统,虽然由于架构的原因对GUI的支持并没有Windows和MacOSX那么好,但是对OpenGL的支持是相当的好,各大显卡厂商也推出了适合Linux的OpenGL的显卡驱动。最后一些开源力量也对OpenGL的支持作出了杰出的贡献。Mesa提供了对OpenGL几乎所有API的软件实现,所以如果在无法启动硬件加速的机器上,使用Mesa提供的实现也未尝不可。
如果使用glut框架的话,那么要使用OpenGL高级的API,就必须配合使用glee这个简易的扩展。而glew的出现就是用一个框架代替glut+glee,Qt则更进了一步。因为严格来说,OpenGL的基本API是基于C语言的,Qt对这些API进行一定程度的封装,并使用C++的诸多概念,让这些API能够真正地做到易用。
接下来我就介绍一下其中的一个类吧。
QOpenGLFunctions类,在Qt4中叫QGLFunctions,它的作用是提供一套OpenGL(ES)2.0API,免去开发人员手动解析这些函数符号。如果你使用glut和glee,那么你一定深有感悟。如果你看过glee的源码和QOpenGLFunctions,那么应该知道,其实QOpenGLFunctions和glee的作用是一样的。它可以绑定VBO,指定Shader等等。最常用的方式应该是在一个GLWidget中直接继承自它,这样可以在这个GLWidget的paintGL()函数中直接调用gl开头的函数了。这也是OpenGL开发人员常见的编码方法,但编译的时候就会发现其实这些gl开头的函数其实是被封装过了的。在使用这些gl开头的函数之前,需要注意调用initializeOpenGLFunctions()函数确保这些函数正确地被解析。
下面是我自己写的一个小例子,它产生和绑定了VBO,使用索引绘制图形,产生和绑定了ColorBufferObject,绘制了一个颜色立方体(colorcube)。使用的是Qt5.1构建。值得注意的是我使用了Enginio库,用户可以浏览该程序的反馈,也可以将对这个程序反馈发送到Enginio后端。这是一个很好的尝试,我可以从中了解大家对我写的例子程序的意见和建议。
演示程序:这里
程序源代码:这里