光栅化是在计算机上生成图像的重要步骤,然而不管是opengl还是directx还是其它的图形接口都封装了光栅化方法.我自己做了个光栅器,接下来就说一下如何实现光栅化的.
为什么要光栅化?
图形管线的输入是图元顶点,输出的则是像素(pixel),这个步骤当中还有个中间产物叫做片段(fragment),一个片段对应一个像素,但片段比像素多了用于计算的属性,例如:深度值和法向量. 通过片段可以计算出最终将要生成像素的颜色值,我们把输入顶点计算片段的过程叫作光栅化.为什么要光栅化?因为要生成用以计算最终颜色的片段.
光栅化的输入和输出分别是啥?
和普通函数一样,光栅化函数也需要输入和输出,从之前的定义来看函数的输入就是组成图元的顶点结构,输出的就是片段结构,为什么说是结构?因为这些可以用c语言中的struct描述.
光栅化发生在哪一步?
通常在图形接口中会暴露顶点处理程序和片段处理程序(感觉着色器听起来也是云里雾里就换成处理程序),但是这当中gpu会进行光栅化插值计算,这也就是为什么片段处理程序的input是顶点处理程序的output经过了插值以后得到的值.既然光栅化是在顶点处理程序以后发生的步骤,那么输入的顶点结构是经过顶点处理以后的,也就是进行过mvp变换,乘以透视矩阵之后的顶点,注意:这步还没有做透视除法,光栅化插值发生在裁剪空间,绝不是标准化空间,所以顶点位置是四维齐次坐标不是三维坐标!
怎么实现光栅化方法?
首先我们可以确定的是光栅化的输入和输出分别是啥.并且应该知道手上可以是用的数据都是啥.
先对输入的顶点进行处理变换到屏幕坐标,对把裁剪空间的顶点坐标转换成标准化空间,就像这样:
ndcA.x=clipA.x/clipA.w;
ndcA.y=clipA.y/clipA.w;
ndcB.x=clipB.x/clipB.w;
ndcB.y=clipB.y/clipB.w;
ndcC.x=clipC.x/clipC.w;
ndcC.y=clipC.y/clipC.w;
接着对顶点的标准坐标进行视口变换: