坐标变换
在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坐标分量。
指定ViewPort参数
我们之前已经调用过了GL10.glViewport(0, 0, width, height)
,这个视口指定了OpenGL视口要绘制的起点坐标与宽高,最终绘制的坐标都只要接收
(
−
1
,
1
)
(-1,1)
(−1,1)范围内的坐标值,这样就可以统一限定与设备无关的坐标值。
视口坐标系
从顶点着色器坐标点到透视图的渲染经历以下流程:
裁剪过程将会把符合 { x ∣ − w ≤ x ≤ w } \{x|-w\leq x \leq w\} {x∣−w≤x≤w}, { y ∣ − w ≤ y ≤ w } \{y|-w\leq y \leq w\} {y∣−w≤y≤w}, { z ∣ − w ≤ z ≤ w } \{z|-w\leq z \leq w\} {z∣−w≤z≤w} 条件的点集经过透视除法组成的空间绘制出来,不符合条件的不予绘制。
纹理坐标系
OpenGL可以由图像、或者某个数学算法生成的分型数据,每个二维纹理都有小的纹理元素(texel)组成,我们最常见的纹理就是从图片文件加载数据。每个二维纹理坐标范围都是
(
0
,
1
)
(0,1)
(0,1),因此坐标范围是从原点
(
0
,
0
)
(0,0)
(0,0)到右上角
(
1
,
1
)
(1,1)
(1,1)。在OpenGL ES 2.0中,纹理的每个维度必须是2的幂。纹理的维度用字母表示为
(
s
,
t
,
r
)
(s,t,r)
(s,t,r)。
2D纹理可以用于存储2D图像的动画序列。