同时显示三角形和矩形,同时移动它们,即坐标转换。将物体设置为多重颜色,即彩色。

模型转换

在 OpenGL ES 中,对模型的转换有三种不同类型,分别是:
1.Translate 移动模型的坐标,方法:glTranslate()
2.Rotate 在 x, y, z 坐标轴上进行旋转,方法:glRotatef()。
3.Scale 改变物体的尺寸,主要应用于在 3D 空间中的 2D 投影,方法:glScalef()。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//工作在顶点模式下
glMatrixMode(GL_MODELVIEW);
//重置所有的状态
glLoadIdentity();
glTranslatef(-1.5, 0.0, -6.0);
glRotatef(rate, 1.0, 0.0, 0.0);
glVertexPointer(3, GL_FLOAT, 0, triangleVertices);
glEnableClientState(GL_VERTEX_ARRAY);
glDrawArrays(GL_TRIANGLES, 0, 3);

glLoadIdentity();
glTranslatef(1.5, 0.0, -6.0);
glRotatef(rate, 0.0, 0.0, 1.0);
glVertexPointer(3, GL_FLOAT, 0, squareVertices);
glEnableClientState(GL_VERTEX_ARRAY);
glDrawArrays(GL_TRIANGLE_FAN, 0, 4);

首先我们必须设置 OpenGL 工作在 顶点模式 下,我们之前使用的是投影模式,对于坐标转换来说,还是需要 顶点模式。
glLoadIdentity() 为重置所有状态值,不使用这个方法的话,状态偏移将会不断的增加,发生在 z 轴上的移动越来越大,直到模型偏离我们消失不见。

模型多重颜色

模型的着色,实际上也是顶点的着色,我们通过给三角形每个顶点着色,改变了模型的整体着色。
着色有两种模式:
1.glShadeModel(GL_FLAT);平面着色,使用每个三角形最后顶点的颜色,设置整个三角形的颜色。

  1. glShadeModel(GL_SMOOTH);平滑着色,使用每个顶点的颜色,平滑设置整个三角形的颜色。
    上代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
const GLfloat squareColours[] = {
1.0, 0.0, 0.0, 1.0,// Red - top left - colour for squareVertices[0]
0.0, 1.0, 0.0, 1.0, // Green - bottom left - squareVertices[1]
0.0, 0.0, 1.0, 1.0, // Blue - bottom right - squareVerticies[2]
1.0, 1.0, 0.0, 1.0 // Grey - top right- squareVerticies[3]
};
glShadeModel(GL_FLAT);
glLoadIdentity();
glTranslatef(1.5, 0.0, -6.0);
glRotatef(rate, 0.0, 0.0, 1.0);
glVertexPointer(3, GL_FLOAT, 0, squareVertices);
glEnableClientState(GL_VERTEX_ARRAY);
glColorPointer(4, GL_FLOAT, 0, squareColours); // NEW
glEnableClientState(GL_COLOR_ARRAY); // NEW
glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
glDisableClientState(GL_COLOR_ARRAY); // NEW

glColorPointer() 函数接受 4 个参数,分别代表颜色的数目,数据类型,0,和颜色数据数组。
我们要开启 OpenGL 的颜色绘制模式,绘制完成后,我们要关闭它,否则会影响到三角形颜色的绘制,值么说来,个人感觉 context 的上下文保存状态可能使用的是栈,每个操作都会压入栈中,我们开启颜色模式,就应该关闭它。

下一篇将会介绍加载一个纹理图片。