前言:最近在做一个项目,需要使用QT结合OpenGL进行开发。由于原来没有怎么用过OpenGL,只知道是个开源图形库,所以先在网上查询了一些资料,发现QT5.5以上版本已经集成了OpenGL,不过和纯OpenGL的使用有些区别,而且相关资料较少。为了便于后续开发并且方便大家共同学习,这里将我的学习过程进行记录(本博客内容只记录了本人的学习过程,不保证完整性和准确性,如想系统学习请绕行。)。由于本人图形开发经验较少,如有错漏敬请指出。
与绘制平面三角形类似,绘制立方体也需要准备三个数据数组:顶点、三角形顶点索引、颜色。与平面相比,该数据更为复杂。以如下立方体为例:
在OpenGL中,使用的是右手坐标系,所以上图中立方体的8个顶点坐标(0~7)可以用如下坐标表示:
GLfloat vertex[] = {
-0.5,-0.5,-0.5,
-0.5,-0.5,0.5,
0.5,-0.5,0.5,
0.5,-0.5,-0.5,
-0.5,0.5,-0.5,
-0.5,0.5,0.5,
0.5,0.5,0.5,
0.5,0.5,-0.5,
};
按照立方体图中的红线进行三角形划分,总共12个三角形(划分方式随意,这里只是给出一个例子),三角形序号数组如下:
GLuint triIndexs[] = {0,2,1,
0,2,3,
2,5,1,
2,5,6,
2,7,3,
2,7,6,
0,5,1,
0,5,4,
4,6,5,
4,6,7,
0,7,4,
0,7,3};
颜色数组与三角形序号数组中顶点个数对应,位12*3,共计36个顶点颜色,每个顶点的颜色使用RGBA共4个数表示,如下所示:
GLfloat colors[] = {1.0f, 0.0f, 0.0f, 1.0f,
0.0f, 1.0f, 0.0f, 1.0f,
0.0f, 0.0f, 1.0f, 1.0f,
1.0f, 0.0f, 0.0f, 1.0f,
0.0f, 1.0f, 0.0f, 1.0f,
0.0f, 0.0f, 1.0f, 1.0f,
1.0f, 0.0f, 0.0f, 1.0f,
0.0f, 1.0f, 0.0f, 1.0f,
0.0f, 0.0f, 1.0f, 1.0f,
1.0f, 0.0f, 0.0f, 1.0f,
0.0f, 1.0f, 0.0f, 1.0f,
0.0f, 0.0f, 1.0f, 1.0f,
1.0f, 0.0f, 0.0f, 1.0f,
0.0f, 1.0f, 0.0f, 1.0f,
0.0f, 0.0f, 1.0f, 1.0f,
1.0f, 0.0f, 0.0f, 1.0f,
0.0f, 1.0f, 0.0f, 1.0f,
0.0f, 0.0f, 1.0f, 1.0f,
1.0f, 0.0f, 0.0f, 1.0f,
0.0f, 1.0f, 0.0f, 1.0f,
0.0f, 0.0f, 1.0f, 1.0f,
1.0f, 0.0f, 0.0f, 1.0f,
0.0f, 1.0f, 0.0f, 1.0f,
0.0f, 0.0f, 1.0f, 1.0f,
1.0f, 0.0f, 0.0f, 1.0f,
0.0f, 1.0f, 0.0f, 1.0f,
0.0f, 0.0f, 1.0f, 1.0f,
1.0f, 0.0f, 0.0f, 1.0f,
0.0f, 1.0f, 0.0f, 1.0f,
0.0f, 0.0f, 1.0f, 1.0f,
1.0f, 0.0f, 0.0f, 1.0f,
0.0f, 1.0f, 0.0f, 1.0f,
0.0f, 0.0f, 1.0f, 1.0f,
1.0f, 0.0f, 0.0f, 1.0f,
0.0f, 1.0f, 0.0f, 1.0f,
0.0f, 0.0f, 1.0f, 1.0f,
};
三个数组定义好后,其它代码与绘制三角形中的代码类似,需要修改如下两个地方:
(1)激活顶点数据的函数glVertexAttribPointer,需要将第2个入参从2修改为3,代表每个顶点的坐标为3个数字,如下所示
glVertexAttribPointer( vertexLocation, 3, GL_FLOAT, GL_FALSE, 0, 0);
(2)为了看出是立体图形,在resizeGL函数的最后添加一句:
projection.rotate(45, QVector3D(0.0, 1.0, 0.0));
即将整个图形绕y轴旋转45度。
如上图所示为本例程的运行结果,由于按照y轴旋转了45度,所以是如图所示的效果。
但是,本例运行结果的立体感不强,主要由于颜色设置不好,以及没有添加光照系统。到这里为止,QT结合OpenGL的基本使用已经介绍完成,其它方面的使用与原始OpenGL类似,网上教程很多,大家可以结合自己的情况学习如何优化,实现更多功能。