Geometry Stage一般包含下面几个阶段
1. Model & View Transform(模型和视图变换) --- 模型空间--> 世界空间
模型变换:每个模型经过模型变换来定位,一个模型可能有多个模型变换,譬如一个模型存在于不同的地方,以不同大小存在于同一个场景等。模型变换改变的是模型的顶点和法线
模型坐标:一个物体的坐标
世界坐标:模型坐标经过模型变换得到世界坐标
世界空间:独一无二,当所有模型经过各自的模型变换,它们都存在于同一个空间,相机(观察者)在世界空间中也有自己的位置和方向
相机空间:将相机放到原点,让它看向-z轴方向(x轴指向右,y轴指向上)
2. Vertex Shading(顶点着色)
shading: 决定光在一种材料上的效果的操作。包含计算在物体上很多点的shading方程。有些计算是在geometry stage进行的,有些是在光栅化阶段进行的
顶点着色需要的数据:每个点的位置,法线,颜色,或者其他需要用来计算着色方程的数字信息
顶点着色通常发生在世界空间,但有时候为了方便,会变换相机和光源到其他空间(模型空间)
vertex shading result: 颜色,向量,纹理坐标,等等
3. 投影(Projection) --- 从三维变为二维的过程
投影:将视景体(view volume)转换为CCV(规范立方体,Canonical view volume),CCV的极值为(−1,−1,−1)和(1, 1, 1).
通常有两种投影方法:正投影和透视投影
正投影:平行线投影后依然平行
透视投影:离相机远的物体会越小,平行线可能会相交,透视投影的view volume叫视锥体,是一个底部为方形的被截断的金字塔形
正投影和透视投影变换都由4X4矩阵构成,模型经过这两个变换会被称为归一化设备坐标
4.clipping(裁剪)
只有完全或者部分在view volume(视景体)里面的primitives才需要被画到屏幕上,完全在view volume之外的primitives不需要被render,部分在view volume里面的primitivies需要clipping。被clip之后会生成交界点处的新的顶点数据。
primitives总是在unit cube中被裁剪的。
除了view volume的六个clipping plane外,用户可以自己定义额外的clipping plane来去除可见物体。
clipping stage和screen mapping stage是硬件中的固定功能,不能编程,前面的其他stage都是可编程的
5. screen mapping(屏幕映射,OpenGL中的视口变换)
只有在view volume里面被裁剪过的primitives才会传到screen mapping阶段,坐标仍然是三维的。
x和y坐标被转换为屏幕坐标。屏幕坐标和z坐标合起来叫做窗口坐标。z坐标的值(-1<=z<=1)不受screen mapping的影响。
举个例子,比如上个阶段中得到了一个顶点的坐标为(0,0,0.5,1),根据这个坐标,该顶点位于投影平面的正中间。如果将该点映射到大小为50*50的窗口上时,那么它应该位于屏幕的中间,坐标为(25,25,0.5,1)。当然这里深度值0.5是不会改变的。有的同学肯定有疑问了,既然投影到了窗口上,那么还要深度值0.5干什么?这里要注意的是,虽然在窗口上显示时只需要x,y坐标就够了,但是要在2D窗口上显示3D图形时深度值是不可少的。这里的深度值不是用于显示,而是用于在光栅化的时候进行深度测试。
注意不同点:OpenGL以左下角为最小值(笛卡尔坐标系),DirectX以左上角为最小值