重心坐标插值
重心坐标往往都是在屏幕空间下所得到的,如果直接使用屏幕空间下的重心坐标进行插值会造成一定的误差,与在view space下是不一样的
透视矫正插值
在屏幕空间进行线性插值得到点c的intensity为0.5,然而对于在view space之中正确的插值结果,可以很明显看到C的intensity绝不为0.5。这也就造成了插值的误差,应该去矫正
首先先分别定义屏幕空间的比例为s,view space中为t
为了简便证明,将点的坐标用2维表示,第一维为图中所示的x轴,第二维为z轴。
简而言之,我们的目标就是得出t与s的关系式,这样就可以正确的利用屏幕空间的系数s插值到正确的view space的结果
由上图所示的投影所造成的三角形相似性可以轻易得出如下几个式子
分别利用screen space 以及 view space的线性插值可以得到以下几个式子
将4式与5式代入3式得
再将1式与2式代入7式得
最后将6式代入8式的左边得到
仔细观察9式,我们已经成功得出了t与s的一个关系式,其中的其它参数都是已知,因此进一步化简不在这里展开,可以得到如下t与s关系
如此就可以利用屏幕空间下的系数得到正确插值结果了
以上证明虽然只是针对线性插值的矫正结果,对于重心坐标插值,我们可以类似类推得出
正确得出深度的插值结果之后,再看看任意属性(法线向量,纹理坐标,view space 坐标)插值结果,依然以线性插值为例先进行推导:用I II代表任意属性
不难看出插值的分母就是深度值的倒数,类推得出重心坐标任意属性的正确插值如下
任意属性自然包括深度值,将深度值z代入16式可以得出与12式一样的结果
图形渲染管线
所谓图形渲染管线指的是一系列操作的流程,这个流程具体来说就是将一堆具有三维几何信息的数据点最终转换到二维屏幕空间的像素。
整个图形管线的步骤可能有不同的分法,不一定就是上图所述的5部分,但整体流程一定是一样的
第一步顶点处理
顶点处理的作用是指对所有的顶点数据进行Model,View,和Projection的变换,最终得到投影到二维平面的坐标信息(同时为了Zbuffer保留深度z值)。当然如果超出观察空间的会被剪裁掉
而第二步三角形处理也十分容易理解,就是将所有的顶点按照原几何信息,变成三角面,每个面由3个顶点组成。得到了许许多多个三角形之后,接下来的操作自然就是三角形光栅化了
在进行完三角形的光栅化之后,知道了哪些在三角形内的点可以被显示,那么如何确定每个像素点或者说片元(Fragement)的颜色呢?[注:片元可能比像素更小,如MSAA抗拒齿操作的进一步细分得到的采样点]。那自然就是着色了,也就是片元处理阶段应该做的
注意这阶段顶点处理也亮起来是因为我们需要顶点信息对三角形内的点进行属性插值(tips:当然也可以直接在顶点处理阶段就算出每个顶点的颜色值,如Gouraud Shading一样)。当然这一阶段也少不了Z-Buffer来帮助确定,哪些像素点应该显示在屏幕上,哪些点被遮挡了不应该显示
最后一步!Framebuffer的处理,就是将所有的像素颜色信息整合在一起,输送给显示设备加以显示。这也就完成了整个图形渲染管线了
在片元处理阶段有一点还未叙述,我们也可以去做texture mapping,利用texture的信息来代替blinn-phong模型漫反射系数来当作颜色