天天看点

【Qt for Android】OpenGL ES 绘制彩色立方体

Qt 内置对OpenGL ES的支持。选用Qt进行OpenGL ES的开发是很方便的,很多辅助类都已经具备。从Qt 5.0開始添加了一个QWindow类,该类既能够使用OpenGL绘制3D图形,也能够使用QPainter绘制2D传统的GDI+图形。5.0曾经的QGLWidget不推荐再使用。在即将到来(官方时间是今年秋天)Qt 5.4会全然废弃QGLWidget。作为替代将会新增QOpenGLWidget和QOpenGLWindow类来方便OpenGL的编程。

好了废话不多说了。今天我会使用OpenGL ES绘制一个彩色立方体,先在桌面平台编译执行成功后,再针对Android平台编译一次就可以。以下是在Android上的执行效果。基于同一个着色器绘制了四个同样的彩色立方体。

【Qt for Android】OpenGL ES 绘制彩色立方体
【Qt for Android】OpenGL ES 绘制彩色立方体

为了使用OpenGL,我从QWindow类和QOpenGLFunctions类派生出了一个OpenGLWindow类。该类声明例如以下:

因为继承自QWindow因此能够使用QWindow提供的OpenGL环境,不须要EGL来控制本地窗体显示图形。同一时候因为继承自QOpenGLFunctions,所以在OpenGLWindow类的成员函数中能够直接使用 gl* 风格的原生的OpenGL API。

在Qt中提供了非常多封装好的OpenGL便捷类,如QOpenGLShaderProgram能够非常方便的对着色器程序进行操作,但这样做可能对不熟悉Qt的人不友好,所以这里我不用Qt提供的便捷类,而直接使用原生的C风格的 OpenGL API进行操作。这全然是能够的(这也是我喜欢Qt的原因之中的一个:提供自身类库的同一时候,同意你使用非Qt的类,并提供二者之间的转换。如Qt中的容器类QVector、QMap、QString能够和C++标准库中的对应容器相互转换)。

甚至你能够混合使用Qt的OpenGL类和原生的OpenGL API。

以下看看几个关键的函数。

首先是initialize()负责着色器的创建、编译、链接等操作。并设置背景色。

代码例如以下。当中被凝视的部分是使用Qt自带类库实现同样的功能。

再来看看QWindow的QExposeEvent事件,当QWindow须要重绘时会调用该事件的处理函数exposeEvent()。这里我对该事件的处理函数进行了重写。isExposed()用来推断当前窗体是否显示在屏幕上(onScreen or offScreen)。仅仅有显示在屏幕上时才重绘(尽管窗体须要重绘,可是因为没有显示在屏幕上。重绘了也没人看得见,所以加这个推断能够降低不必要的画图操作)。

首先创建OpenGL上下文,然后进行调用对应的初始化函数,这两步仅仅在第一次被运行,以后不会再运行。接下来是该函数的核心部分,调用render()函数在后端缓冲区进行图形渲染,然后交换前端和后端缓冲区,让后端缓冲区图形显示到界面上。

最后看看render()渲染函数,这个也是学习OpenGL的主要部分。

在render()函数的開始部分创建了一个QOpenGLPaintDevice实例,该演示样例用于绘制QPainter的画图操作。这里能够忽略,删掉也能够。

接下来就是定义立方体的顶点位置,以及顶点索引。创建2个顶点缓冲区对象(vertex buffer object),通过glBufferData()函数将立方体的顶点位置和顶点所以放到顶点缓冲区对象中,将顶点位置通过glVertexAttribPointer()传递给顶点着色器。计算model/view/projection。然后将结果通过glUniformMatrix4fv()传递给顶点着色器中的mvp。最后使用glDrawElement()绘制立方体。

立方体每一个点的颜色由其所在的位置决定,所以不同位置的顶点具有不同颜色。

好了大致就这样了~

本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/5093679.html,如需转载请自行联系原作者

继续阅读