视角场与宽高比
完成MVP变换后,就需要将模型画到屏幕上了。
屏幕
- 一个二维的像素数组
- 数组的大小:分辨率
- 一种典型的光栅成像设备
光栅就是屏幕的德语,光栅化就是将物体显示在屏幕上。
- 像素通过(x,y)的坐标形式表示,像素的中心在(x+0.5,y+0.5)
- 如果我们认为屏幕的分辨率为width∗height,那么共有(0,0)~(width−1,height−1) 个像素
- 屏幕空间覆盖了(0,0)到(width,height)的范围
视口变换
- 与z轴无关
- 由
视口变换矩阵:
采样
采样一个像素,判断它是否在模型的三角形内部。
首先需要明确采样点位置,一般选用像素中心作为采样点,坐标为(x + 0.5, y + 0.5)。
这里给出两种判断像素是否在三角形内部的方法:
叉乘法
首先按顺时针或者逆时针顺序给出三角形的三个顶点的坐标,坐标只关心X、Y。这里以逆时针为正做演示。
当时,在边左边。
当时,在边边的延长线上。
当时,在边边的右侧。
可知,当全部都在左侧也就是上面的三个式子都大于0的时候,点Q在三角形内部。当本方法只能判断内外,不能进行后续的插值运算(比如深度插值)。
重心坐标法
三角形内任意一点都可以被表示为三个顶点的线性组合。
如果,都大于等于0小于等于1,那么P在三角形内部。
计算重心坐标首先要计算三角形的面积。
系数等于对边三角形的面积/三角形的总面积。
性能优化-增量式计算
可知,对于每一个三角形,它的面积也就是上面式子的分母是不变的。而分子经过变换都能写成的形式。而相邻像素的x与y是依次递增的关系。当x+1时,可在前一个像素的基础上加A。当y+1时加B。
透视校正插值
屏幕空间中的重心坐标不能直接用于纹理坐标、法线、颜色、世界坐标等属性的插值。而齐次除法(透视除法)是非线性变换,变化后的屏幕空间不能直接组合3D空间中的属性插值。应该先进行透视校正。
包围盒优化
实际上,我们不需要对屏幕上每个像素都判断它是否在三角形内部。我们可以确定三角形三个顶点的最小x、最大x、最小y、最大y,只对处于该包围盒的像素进行计算。
采样瑕疵
采样是对输入信号进行离散地取样。当信号变换过快而采样频率过慢时就会出现采样瑕疵。包括锯齿、摩尔纹等。
MSAA抗锯齿
首先,对每个像素增加采样点。对这些采样点做覆盖测试,判断它是否在三角形内部,并且要做深度测试。只有通过了深度测试的采样点才是有效的采样点。
片元着色器还是对像素中心点的位置进行着色。每个采样点都需要单独保留深度与颜色。通过采样测试的点的颜色就是这个像素通过深度插值得出来的颜色。而未通过测试的点不更新深度也不更新颜色。
最后所有物体渲染完成,将每个像素的采样点读取出来,对颜色取平均值就是该像素的颜色。