在3D坐标空间中,用于表示图形的数据一定包含位置信息 ( x , y , z ) (x,y,z) (x,y,z),但是除此之外,还要有一个量用于标定用户视角与被观测物体的距离关系,用户视角由成为摄像机Camera,因此需要增加一个维度取名叫 w w w,那么着色器的坐标gl_Position就会多增加一个量成为一个四维向量 ( x , y , z , w ) (x,y,z,w) (x,y,z,w)。 这套OpenGL的坐标系统被称为归一化设备坐标。既然 w w w分量定义了视角关系,那么它相当于定义了一个距离空间,这个空间要求 ( x , y , z ) (x,y,z) (x,y,z)这三个分量的都要在 ( − w , w ) (-w,w) (−w,w)的范围内取值,这个空间被称为剪裁空间。
透视除法由于 w w w用来表示点对摄像机的距离,那么对于一个正方体来说,这个正方体看起来就不那么“正”了,对于一个正方体来说,每个点的属性除了 ( x , y , z ) (x,y,z) (x,y,z)还增加了距离 w w w,并且在绘制时还增加了一个步骤,绘制最终位置时实际上做了一个操作 ( x w , y w , z w ) (frac{x}{w},frac{y}{w},frac{z}{w}) (wx,wy,wz),使得最终点的位置是一个近大远小的透视化正方体。
一般一个正方体,在笛卡尔坐标轴上,正常的显示是一个这样的:
存在摄像机透视关系的正方体,看不出正方体前后两个面相对于摄像机的距离关系。
而增加了透视关系之后,则有了对于摄像机来说近大远小的关系,如下:
存在摄像机透视关系的正方体,能看的出正方体的两个面有着相当明显的距离。
最终我们不会因为
z
z
z轴的数值多增加了一个相对的观测距离这个意义,而是让观测作为一个单独的位置分量,而不是让距离这个属性影响物体所在位置的
z
z
z坐标分量。
我们之前已经调用过了GL10.glViewport(0, 0, width, height),这个视口指定了OpenGL视口要绘制的起点坐标与宽高,最终绘制的坐标都只要接收 ( − 1 , 1 ) (-1,1) (−1,1)范围内的坐标值,这样就可以统一限定与设备无关的坐标值。
视口坐标系从顶点着色器坐标点到透视图的渲染经历以下流程:
裁剪过程将会把符合 { x ∣ − w ≤ x ≤ w } {x|-wleq x leq w} {x∣−w≤x≤w}, { y ∣ − w ≤ y ≤ w } {y|-wleq y leq w} {y∣−w≤y≤w}, { z ∣ − w ≤ z ≤ w } {z|-wleq z leq w} {z∣−w≤z≤w} 条件的点集经过透视除法组成的空间绘制出来,不符合条件的不予绘制。



