任何使用矩阵变换来对顶点进行变换,x,y,z必须在-1.0到1.0之间,超出去的将不可见,一般的我们会自己设定范围,之后将顶点着色器将这些坐标变为标准化设备坐标,将标准化设备坐标传入光栅器。将他们在变化为二维坐标或者像素。
(我们自己设置范围,也就是在书写的过程中,并不是些0到1这样的数据,比如说720x1280)
坐标变换为标准化设备坐标,接着转换为屏幕坐标。在这个之前还会有许多坐标系统,一起参与的结果。
坐标空间
转换到片段之前需要经历的几个状态
- 局部空间:每次我们开始的坐标,绘制一个物体
- 世界空间:
- 观察空间
- 裁剪空间
- 屏幕空间
概述
坐标的目标是为了将坐标系统转化到另一种坐标系中,需要经过几次矩阵变换:模型、观察、投影三个矩阵。
起始于局部,它是一个局部坐标,之后在变为世界坐标,观察坐标、裁剪坐标,最后的屏幕坐标。
1.局部坐标对象相对于局部原点,也是起始坐标(这个比如一个三角形,我们给的三个顶点)
2.将局部坐标变为到世界坐标,将局部物体相对于世界原点进行摆放。(比如世界,我们定义的是720x1280,然后对于原点位置,需要根据相机位置,判断是手机的那个位置。如果不设置都现实在世界的0,0点)
3.世界坐标转换为观察空间坐标,使得从观察着的角度,这个根据相机的位置就是,来确定在屏幕的位置。
4.裁剪坐标,裁掉不是落在-1,1范围内的,之外的就会被抛弃
5.裁剪到视口,做好将最后变换的坐标送入到光栅器中,最后变换为片段。
坐标转换需要几个变换矩阵,最重要的有三个模型 观察 投影。
1.局部空间
物体的起始坐标。
2.世界空间
相对于世界原点,它们会和其他物体一起相对于世界原点进行摆放。
3.观察空间
将其转换为从摄像机的方向去观察。
4.裁剪空间
裁剪空间只处理-1到1范围内,并判断将那些顶点显示在屏幕上。
5.屏幕空间
视口转换,将坐标转换到glViewport函数所在的范围内
最后会将坐标送到光栅器,转换为片段。转换到相应坐标中的目的是为了可以更方便的执行操作。
局部空间
局部空间只物体所在的坐标空间,对象开始的地方,比如一个三角形,建模的开始就是在0,0,0位置。
世界空间
游戏720x1280就是这个世界空间,它通过矩阵变换之后,变为一个小点的物体。然后进行绘制。
建模完成之后的图形都在0,0位置上,想为每一个物体放置一个位置,那么就需要世界坐标转换。
模型矩阵:它是一个变换矩阵,通过物体进行位移,缩放,旋转将它置于本应该在的位置或者朝向,第一步需要缩放,因为它比较大,将他放到一个小镇,然后设置它的位置,将局部坐标转换为世界坐标中。
观察空间
一般被说为摄像机,摄像空间,或者视觉空间,世界转换为用户视野前方的坐标而产生的结果,它是通过摄像机视角看到的景象,
裁剪空间
顶点着色器运行的最后,Open GL期望所有的坐标落在一个范围内,在次范围之外的都被裁剪,裁剪之外的看不到,里面可以看的见。
为了顶点坐标从观察去裁剪空间,需要定义一个投影矩阵,他会指定一个分为-1000,1000,这个矩阵会将指定范围内的坐标转换为一个标准的范围内。
范围之外的不会被映射
投影矩阵创建的观察箱称为平截头体,在范围内可以被显示在屏幕上,将可以看见的转换到标准设备的过程称之为投影。
顶点被放到裁剪空间之后,最后会使用透视除法,会将位置x,y,z除以w分量,透视除法将4D裁剪空间坐标转换为3D标准化设备的过程,在顶点着色器运行的最后被执行(自动)。
最后坐标被映射到屏幕空间中,并被变换乘片段。
正交
透视
将他们组合
上述的每一个步骤都创建一个变换,下面会变换到裁剪空间(裁剪和透视除法是opengl自己完成的)。
vclip = Mprojection * Mview * Mmodel * Vlocal
矩阵运算的顺序是反的,顺序反了,结果会存在问题的
透视到屏幕,就变为了标准化坐标。
进入3D
3D转换为2D坐标,创建一个模型矩阵,包含了位置、缩放、位移
网友评论