首先清楚OpenGL中的常用几个函数作用:
(1)initializeGL() 初始化OpenGL函数
(2)resizeGL(int w, int h)调整窗口大小函数
(3)paintGL()绘制图像函数
1、paintGL()函数作调整
先定义模型、观察、投影3个矩阵。
//1、定义的4*4的矩阵 模型 观察 投影矩阵
QMatrix4x4 model;
QMatrix4x4 view;
QMatrix4x4 projection;
/*----------按照时间对图片进行旋转----------*/
QMatrix4x4 matrix;
unsigned int time=QTime::currentTime().msec();//毫秒
//matrix.translate(0.5,-0.5,0);//移动到该位置 z坐标不变
//1、值 旋转后的矩阵 旋转角度-45度 往x轴进行旋转
model.rotate(-45, 1.0f, 0.0f, 0.0f);
//2、观察坐标 z轴网上移动3
view.translate(0.0,0.0,-3);
//3、角度45度 宽高比 远近值分别为0.1和100
projection.perspective(45,(float)width()/height(),0.1,100);
效果如下:
顶点着色器和c文件代码部分作相应调整
2、顶点坐标改变
顶点坐标位置如下:
float vertices[] = { //坐标 3 纹理坐标 2
-0.5f, -0.5f, -0.5f, 0.0f, 0.0f,
0.5f, -0.5f, -0.5f, 1.0f, 0.0f,
0.5f, 0.5f, -0.5f, 1.0f, 1.0f,
0.5f, 0.5f, -0.5f, 1.0f, 1.0f,
-0.5f, 0.5f, -0.5f, 0.0f, 1.0f,
-0.5f, -0.5f, -0.5f, 0.0f, 0.0f,
-0.5f, -0.5f, 0.5f, 0.0f, 0.0f,
0.5f, -0.5f, 0.5f, 1.0f, 0.0f,
0.5f, 0.5f, 0.5f, 1.0f, 1.0f,
0.5f, 0.5f, 0.5f, 1.0f, 1.0f,
-0.5f, 0.5f, 0.5f, 0.0f, 1.0f,
-0.5f, -0.5f, 0.5f, 0.0f, 0.0f,
-0.5f, 0.5f, 0.5f, 1.0f, 0.0f,
-0.5f, 0.5f, -0.5f, 1.0f, 1.0f,
-0.5f, -0.5f, -0.5f, 0.0f, 1.0f,
-0.5f, -0.5f, -0.5f, 0.0f, 1.0f,
-0.5f, -0.5f, 0.5f, 0.0f, 0.0f,
-0.5f, 0.5f, 0.5f, 1.0f, 0.0f,
0.5f, 0.5f, 0.5f, 1.0f, 0.0f,
0.5f, 0.5f, -0.5f, 1.0f, 1.0f,
0.5f, -0.5f, -0.5f, 0.0f, 1.0f,
0.5f, -0.5f, -0.5f, 0.0f, 1.0f,
0.5f, -0.5f, 0.5f, 0.0f, 0.0f,
0.5f, 0.5f, 0.5f, 1.0f, 0.0f,
-0.5f, -0.5f, -0.5f, 0.0f, 1.0f,
0.5f, -0.5f, -0.5f, 1.0f, 1.0f,
0.5f, -0.5f, 0.5f, 1.0f, 0.0f,
0.5f, -0.5f, 0.5f, 1.0f, 0.0f,
-0.5f, -0.5f, 0.5f, 0.0f, 0.0f,
-0.5f, -0.5f, -0.5f, 0.0f, 1.0f,
-0.5f, 0.5f, -0.5f, 0.0f, 1.0f,
0.5f, 0.5f, -0.5f, 1.0f, 1.0f,
0.5f, 0.5f, 0.5f, 1.0f, 0.0f,
0.5f, 0.5f, 0.5f, 1.0f, 0.0f,
-0.5f, 0.5f, 0.5f, 0.0f, 0.0f,
-0.5f, 0.5f, -0.5f, 0.0f, 1.0f
};
3、initializeGL()函数作调整
由于顶点坐标位置做了相应调整,所以初始化函数initializeGL()中的解析属性的函数glVertexAttribPointer()和glEnableVertexAttribArray()对应的参数需要作相应调整。比如占据的字节数3float,总的步长5float,还有对应的偏移量根据实际占用float数目作调整。
4、顶点着色器作调整
增加model、view、projection矩阵
5、片段着色器作调整
6、剪切坐标系不需要每一帧都更新projection
在initializeGL()函数中,增加对projection矩阵的初始化。
QMatrix4x4 projection;//不需要每一帧都更新projection 剪切坐标系
//3、角度45度 宽高比 远近值分别为0.1和100
projection.perspective(45,(float)width()/height(),0.1,100);
shaderProgram.setUniformValue("projection", projection);//projection单位矩阵
7、paintgl()函数中清空深度、颜色缓冲区域
8、根据时间 围绕x轴进行旋转