Model, View(Camera), Perspective (3)

最后一篇博客讲一下Perspective(透视)。

在顶点运算器的最后,OpenGL希望所有的坐标落在一个特定的范围内,超出这个范围的物体就会被裁剪或者重新渲染。而从观察空间变化到裁剪空间,所需要的就是投影矩阵,投影矩阵有两种,一种是正射投影(ortho),另一种是透视投影(perspective)。

创建正射投影可以用函数glm::ortho,透视投影可以用函数glm::perspective。

正射投影会直接将坐标映射到2D平面,但是直接正射的话会产生一个不真实的结果,我们知道3D空间中都有透视的概念(近大远小),因此实际情况中更多采用的是透视投影(透视投影矩阵会自动修改w坐标的值,离观察者越远的w分量越大,最后输出会将x, y, z坐标除以w分量,既透视除法)。

实际上正射投影也有w分量,但是正射投影矩阵不会改变w分量,因此也就无法达成透视的效果。

透视完成之后,我们可以将所有的变换组合到一起,相乘,再赋值给gl_Position(从右往左)。

OpenGL然后对裁剪坐标执行透视除法从而将它们变换到标准化设备坐标。OpenGL会使用glViewPort内部的参数来将标准化设备坐标映射到屏幕坐标,每个坐标都关联了一个屏幕上的点(在我们的例子中是一个800x600的屏幕)。这个过程称为视口变换。

posted @ 2019-10-06 15:20  jckcoenf  阅读(259)  评论(0编辑  收藏  举报