概述
我们这次在上一个绘制单个立方体的功能上进行拓展:绘制更多个立方体,区别在于它们的世界坐标和旋转角度不同。如何做呢?需要我们把36个顶点再拷贝几份吗?不需要这样做,我们需要做的是在渲染时为每一个立方体定义一个不同的世界坐标,在渲染生成旋转矩阵时随机一个角度值即可。
世界坐标的定义
定义10个不同的世界坐标
glm::vec3 cubePositions[] = {
glm::vec3( 0.0f, 0.0f, 0.0f),
glm::vec3( 2.0f, 5.0f, -15.0f),
glm::vec3(-1.5f, -2.2f, -2.5f),
glm::vec3(-3.8f, -2.0f, -12.3f),
glm::vec3( 2.4f, -0.4f, -3.5f),
glm::vec3(-1.7f, 3.0f, -7.5f),
glm::vec3( 1.3f, -2.0f, -2.5f),
glm::vec3( 1.5f, 2.0f, -2.5f),
glm::vec3( 1.5f, 0.2f, -1.5f),
glm::vec3(-1.3f, 1.0f, -1.5f)
};
渲染类的实现
在上一节渲染类draw3D_cube的基础上进行修改开发draw3D_moreCube渲染类:
- 将视图矩阵、投影矩阵的设定移动到init函数里;
- 将上述的位置定义加入到draw函数中;
- 修改渲染方法为一个循环,在每一次循环中进行模型矩阵的计算设定,然后绘制:
// 模型矩阵
for(int i=0; i<10; i++) {
glm::mat4 model(1.0);
model = glm::translate(model, cubePositions[i]);
model = glm::rotate(model, (float)glfwGetTime(), glm::vec3(1.0f, 0.3f, 0.5f));
GLuint locModel = glGetUniformLocation(m_pShader->ID, "model");
glUniformMatrix4fv(locModel, 1, GL_FALSE, glm::value_ptr(model));
glDrawArrays(GL_TRIANGLES, 0, 36);
}
运行起来,我们将看到一组旋转的立方体:

很多个立方体
总结
在坐标系统中学习了:
五种空间:
- 局部空间;
- 世界空间;
- 视图空间;
- 裁剪空间;
- 屏幕空间;
三个矩阵:
- 模型矩阵
- 视图矩阵;
- 投影矩阵;
顶点转换到裁剪空间的计算
vP = Pm * Vm * Mm * locVertex;
需要从右向左读:顶点坐标经过和模型矩阵、视图矩阵和投影矩阵进行乘法运算后得到裁剪空间的坐标。
Z缓冲
Z-buffer是由GLFW自动生成,存储所有的深度信息到Z-buffe中,每个片段有一个深度值(做为它的z值),一个片段在输出颜色前会和Z缓冲进行比较,若当前片段处于后方则丢弃。