openGL希望所有屏幕可见东西的坐标都是NDC,(normalized device coordinates)。normalized这个词我个人还是比较喜欢的,在程序里经常用它命名一些工具函数,可以理解成按照某个标准或者规范处理一些数值、数据。
将openGL空间的3D坐标转换成NDC一般会经过几步,即经过一些中间坐标系统的表示,为什么不直接转化呢,因为不同坐标系统会对某些操作更加友好,更加擅长。
Local space (or Object space)
World space
View space (or Eye space)
Clip space
Screen space
先通过一张图表示大致坐标系统转化
本地坐标系
本地坐标系是相对于物体本身原点而言,是对象占据空间内部的坐标,故又称对象坐标系
本地/世界坐标系转化
接下来就是物体本地坐标系转化成世界坐标系,世界坐标系是相对于现实世界的某个原点的坐标
世界/视口坐标系转化
接下来就是物体世界坐标系转化成视口坐标系,视口坐标系是通过相机或观察角度(point of view)的坐标
视口/裁切坐标系转化
接下来就是物体视口坐标系转化成裁切坐标系,裁切坐标系是[-1.0, 1.0]范围的坐标,并且丢掉这个范围以外的坐标。这个将视口坐标系投影成裁切坐标的过程如果有透视需要,可以添加透视效果
裁切/屏幕坐标系转化
最后一步,将裁切坐标转化成屏幕坐标,这个过程叫视口转化,最后的坐标数据再经过栅格化处理,片元着色器等管道化处理最终显示在屏幕上