(仅是草稿,未做整理)
2.10 坐标转换
在帧缓存中,顶点,法线和纹理坐标在用来生成一个图像的之前,将被转换。首先,我们先描述顶点坐标如何转换及控制。
图2.5 是顶点转换的流程方框图。在GL上的顶点坐标,被称为对象坐标(object coordinates),然后用模型视图应用于对象坐标,从而生成眼坐标(eye coordinates),再用另个矩阵,即投影矩阵应用于眼坐标,从而生成剪辑坐标。然后用透视分离的方法应用于剪辑坐标从而生成了归一化的设备坐标(normalized device coordinates)。最终的视点(view port)转换应用于这些坐标,从而把它们转换成视窗坐标。
对象坐标,眼坐标,剪辑坐标都是四维的,包括x,y,z和w坐标。模型视图和投影矩阵是4x4。
图2.5 顶点坐标转换流程
如果一个顶点的对象坐标为,模型视图矩阵为M,那么顶点的眼坐标为
同样,如果P是投影矩阵,那么剪辑矩阵为
归一化设备坐标为
2.10.1控制视点
视点转换由视点的宽高决定,宽高以像素为单位,分别为px和py,中心点为(ox,oy),也是以像素也单位。顶点的视窗坐标为,如下定义
其中系数和偏移量应用于zd,表示为n和f,通过以下命令进行编码
void DepthRangef( clampf n,clampf f );
void DepthRangex( clampx n,clampx f );
每一个n和f被限制在[0,1]之间,作为clampf 和clampx 的参数。zw是一个定点数,根据帧缓存的深度缓存,必须有足够的比特数。假定定点数所表示的值为,其中,(例如,1.0表示二进制所有的strings)
视点转换的参数通过以下命令设置
void Viewport( int x,int y,sizei w,sizei h );
其中x,y表示视窗左下角坐标,w和h表示视窗的宽高,视点的其他参数,可以通过以上的等式而得到,如ox=(x+w)/2,oy=(y+h)/2, px=w, py=h。
视点的宽高要根据实现无关性最大值进行截断。最大的宽高可以从执行合适的Get命令进行获取,见第6章节。最大的视点维度必须大于或等于要渲染的可视的维度,如果w或h为负,那么将产生INVALID_VALUE错误。
实现视点转换的条件是四个整数和两个截断的浮点数。在初始状态,w和h设置为GL要渲染的视窗宽高值,ox为w/2,oy为h/2, n为0.0,f为1.0。