这是一个正方体,在坐标系中可以表示成6个面的组合。既然前面我们已经绘制过矩形了,那么这里我们还是可以像前面一样根据坐标绘制出所有的矩形,组合起来就是立方体了。
首先定义顶点坐标:
static GLfloat vertices[] = {
// X轴+
0.5, 0.5, -0.5, 1, 0, 0,
0.5, -0.5, -0.5, 1, 0, 0,
0.5, 0.5, 0.5, 1, 0, 0,
0.5, 0.5, 0.5, 1, 0, 0,
0.5, -0.5, 0.5, 1, 0, 0,
0.5, -0.5, -0.5, 1, 0, 0,
// X轴-
-0.5, 0.5, -0.5, 1, 0, 0,
-0.5, -0.5, -0.5, 1, 0, 0,
-0.5, -0.5, 0.5, 1, 0, 0,
-0.5, -0.5, 0.5, 1, 0, 0,
-0.5, 0.5, 0.5, 1, 0, 0,
-0.5, 0.5, -0.5, 1, 0, 0,
// Y轴+
-0.5, 0.5, -0.5, 0, 1, 0,
-0.5, 0.5, 0.5, 0, 1, 0,
0.5, 0.5, 0.5, 0, 1, 0,
0.5, 0.5, 0.5, 0, 1, 0,
0.5, 0.5, -0.5, 0, 1, 0,
-0.5, 0.5, -0.5, 0, 1, 0,
// Y轴-
-0.5, -0.5, -0.5, 0, 1, 0,
-0.5, -0.5, 0.5, 0, 1, 0,
0.5, -0.5, 0.5, 0, 1, 0,
0.5, -0.5, 0.5, 0, 1, 0,
0.5, -0.5, -0.5, 0, 1, 0,
-0.5, -0.5, -0.5, 0, 1, 0,
// Z轴+
-0.5, 0.5, 0.5, 0, 0, 1,
-0.5, -0.5, 0.5, 0, 0, 1,
0.5, -0.5, 0.5, 0, 0, 1,
0.5, -0.5, 0.5, 0, 0, 1,
0.5, 0.5, 0.5, 0, 0, 1,
-0.5, 0.5, 0.5, 0, 0, 1,
// Z轴-
-0.5, 0.5, -0.5, 0, 0, 1,
-0.5, -0.5, -0.5, 0, 0, 1,
0.5, -0.5, -0.5, 0, 0, 1,
0.5, -0.5, -0.5, 0, 0, 1,
0.5, 0.5, -0.5, 0, 0, 1,
-0.5, 0.5, -0.5, 0, 0, 1,
};
定义好顶点坐标,修改一下glDrawArrays方法:
// 绘制
glDrawArrays(GL_TRIANGLES, 0,36);
绘制效果:
这效果就不对了。因为我们还没有开启深度测试,默认不开启,谁后绘制谁在最上面。如果开启GL_DEPTH_TEST之后,绘制顺序则按照Z轴的坐标为准。
// 开启深度测试
glEnable(GL_DEPTH_TEST);
如果按照Z轴排序是要激活一个新的深度缓存区的,所以每次清除缓存区的时候不仅要清除颜色缓存数据还要清除深度缓存数据,否则会影响新的深度数据的写入。
// 清除缓存 添加GL_DEPTH_BUFFER_BIT
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
修改完成之后再看一下效果:
通过上面两个地方的修改,现在的效果就正常了。因为之前我们已经能够绘制二维图形,而立方体就是二维图形的组合,所以这篇正方体的绘制讲解比较简短。
下一篇开始学习纹理了,这里的正方体每个面设置为不同的颜色,下一篇我们可以给正方体每个面贴上纹理图,让它看起来更生动形象。
附上本文源码:LearningOpenGL ES GitHub