OpenGLES入门(三)

作者: 言叶之庭_ | 来源:发表于2019-06-30 16:54 被阅读28次

    上一章中还是对平面图形的绘制和简单的图形变换,在本章中将会开始绘制简单的3D图形,并对图形进行组合变换。

    开始学习之前,先要了解几个概念。

    1.计算机图形学

    首先了解计算机处理图形的流程。

    应用程序把数据以图元的方式提供给图形硬件,一般是点、线、多边形、纹理映射图像;基本图元通过几何变换和投影变换,获得二维屏幕坐标;对每一个屏幕像素点进行着色,得到具体的显示帧。

    2.几何处理阶段

    以顶点为基础,对几何图元进行处理,把三维坐标转变为二维屏幕坐标的过程。

    本章的重点就在于视图坐标变换的过程。

    物体模型的顶点在最终转化为屏幕坐标之前还会被变换到多个坐标系统(Coordinate System)。将物体的坐标变换到几个过渡坐标系(Intermediate Coordinate System)的优点在于在这些特定的坐标系统中,一些操作或运算更加方便和容易,这一点很快就会变得很明显。对我们来说比较重要的总共有5个不同的坐标系统:

    1.局部空间(Local Space,或者称为物体空间(Object Space))

    2.世界空间(World Space)

    3.观察空间(View Space,或者称为视觉空间(Eye Space))

    4.裁剪空间(Clip Space)

    5.屏幕空间(Screen Space)

    这就是一个顶点在最终被转化为片段之前需要经历的所有不同状态。更加详细的解释可以看这里

    为了将坐标从一个坐标系变换到另一个坐标系,我们需要用到几个变换矩阵,最重要的几个分别是模型(Model)、观察(View)、投影(Projection)三个矩阵。我们的顶点坐标起始于局部空间(Local Space),在这里它称为局部坐标(Local Coordinate),它在之后会变为世界坐标(World Coordinate),观察坐标(View Coordinate),裁剪坐标(Clip Coordinate),并最后以屏幕坐标(Screen Coordinate)的形式结束。下面的这张图展示了整个流程以及各个变换过程做了什么:

    这里只介绍我们在代码中最重要的三个矩形变换:

    1.模型矩阵变换(Model):我们已经知道了,对物体模型的变换,就是对物体所有顶点坐标的变换。将物体的坐标从自身的局部空间变换到世界空间,这里使用Mode Matrix,即模型矩阵。通过模型矩阵变换,我们可以实现平移、缩放、旋转等变换操作或组合变换,这里需要注意变换的顺序,顺序不一样,得到的结果也会不一样。

    2.观察矩阵变换(View):观察空间就是是将世界空间坐标转化为用户视野前方的坐标而产生的结果。因此观察空间就是从摄像机的视角所观察到的空间。而这通常是由一系列的位移和旋转的组合来完成,平移/旋转场景从而使得特定的对象被变换到摄像机的前方。这些组合在一起的变换通常存储在一个观察矩阵(View Matrix)里。

    3.投影矩阵变换(Projection):我们每个人的在一个顶点着色器运行的最后,OpenGL期望所有的坐标都能落在一个特定的范围内,且任何在这个范围之外的点都应该被裁剪掉(Clipped)。被裁剪掉的坐标就会被忽略,所以剩下的坐标就将变为屏幕上可见的片段。这也就是裁剪空间(Clip Space)名字的由来。因为将所有可见的坐标都指定在-1.0到1.0的范围内不是很直观,所以我们会指定自己的坐标集(Coordinate Set)并将它变换回标准化设备坐标系。为了将顶点坐标从观察变换到裁剪空间,我们需要定义一个投影矩阵(Projection Matrix)。将观察坐标变换为裁剪坐标的投影矩阵可以为两种不同的形式:正射投影矩阵(Orthographic Projection Matrix)或一个透视投影矩阵(Perspective Projection Matrix)。这两者的区别在上面的链接中也有详细的解释。

    下面贴一部分项目中的代码,主要是矩阵变换的部分,都标有详细的注释:

    这部分的内容比较难以理解,结合OpenGL教程和本章提供的代码阅读。代码在这里

    相关文章

      网友评论

        本文标题:OpenGLES入门(三)

        本文链接:https://www.haomeiwen.com/subject/kazpcctx.html