OpenGL学习笔记(六)-坐标系统
概述
本节核心就是一张图:

局部空间(Local Space)
局部空间是物体所在的空间,比如在DCC软件中创建的模型所在的空间.
世界空间(World Space)
世界空间是全局坐标系,为世界中的所有物体提供一个坐标系.
观察空间(View Space)
观察空间是摄像机所在的空间,它是相机的视角,是摄像机看到的世界的局部空间.
裁剪空间(Clip Space)
在我们的着色器中,我们希望坐标都能落在一个特定的范围,否则在着色器运算中会增加很多复杂的步骤,因此需要对观察空间进行裁剪变换到NDC空间.
应用
glm库已经为我们实现好了计算这些变换矩阵的方法:
glm::mat4 model = glm::mat4(1.0f); // 模型矩阵 |
接下来只要把mvp矩阵传给着色器就可以变换我们的正方形了.
但是在此之前,我们先升级我们的正方形为立方体.
float vertices[] = { |
然后我们会得到类似的效果:

oops! 这看起来十分奇怪,原因是我们没有开启z-buffer,所以OpenGL并不知道哪些物体应该在前面,哪些物体应该在后面.
glEnable(GL_DEPTH_TEST); // 开启深度测试 |
再次运行程序,我们会得到正确的渲染效果:

我们可以通过进行多次drawCall来实现渲染多个立方体.
glBindVertexArray(VAO);**** |
但是过多的DrawCall会导致性能问题,如何减少DrawCall就成为了一个主流的优化方向.主流思想就是一次打包尽可能多的物体为一个batche,然后一次性渲染.
摄像机
我们在前文中会发现一个重要的存在,但我们至今仍未提起–摄像机.
可以发现,VP矩阵都和摄像机有关,因此我们可以创建一个摄像机类.
Camera.hpp:
/* |
Camera.cpp:
/* |
这样子我们就可以简化main中的代码了.
同时通过接受输入,可以调用Camera的成员函数来控制摄像机的移动,旋转,缩放.比如:
if(glfwGetKey(window, GLFW_KEY_W) == GLFW_PRESS) |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 VanishingBlog!