rasterizer stage的目标:计算和设置每个像素的颜色。将屏幕空间的二维顶点和每个顶点的shading信息转换为屏幕上的像素。
rasterizer stage可以分为几个阶段:triangle setup, triangle traversal, pixel shading, and merging
1. Triangle Setup 这个阶段是计算三角形surface的微分及其他数据的。此阶段生成的数据用来做扫描转换(scan conversion)和对不同的shading数据进行插值。
这个阶段是由fixed-operation hardware(固定操作硬件)完成的.
2. Triangle Traversal
寻找哪些采样点或者像素在三角形内部的过程叫triangle traversal 或者 scan conversion.
每个三角形fragment的属性都是用三角形顶点之间的插值生成的,这些属性包含depth,从geometry stage来的shading data
扫描转换:把顶点表示转换为点阵表示,即从给定的边界出发求出位于内部的各像素
3. Pixel Shading
所有的像素着色都是在这一步完成,输入数据是shading data的插值,输出数据是一个或者多个颜色值。
和前两个阶段不同的是,这一阶段是在可编程GPU核上执行的。
大量的技术被用在这一阶段,其中最重要的就是texturing。
4. Merging(混合)
每个像素的信息被存储在color buffer中,color buffer是一个颜色数组。
Merging stage负责将shading stage产生的fragment color混合到buffer中现有的color里面。
Merging stage也负责解决可见性问题,一般GPU是通过Z-buffer algorithm来解决的,详情见下面一节。
Merging stage不完全是可编程的,但是可以高度配置,可以enable各种效果
5. Z-buffer(depth buffer) algorithm
Z-buffer和color buffer一样大小和形状,每个像素存储着从相机到当前primitive的z轴距离。
当一个图元被选入到某个像素时,需要计算这个图元在这个像素的z值并和同一个像素上的z-buffer内容比较,如果新的z值比z-buffer中的小,那么说明图元离相机更近,所以要用图元的z值和颜色去更新这个像素的z值和颜色;如果新的z值比z-buffer中的大,说明图元距离相机更远,那么color buffer和z-buffer就不需要更新。
6. 其他buffer
alpha通道与color buffer有关系,它存储每个像素的透明度。 在depth test之前可以先做alpha test,先用某些特定的test来比较fragment的alpha值和参考值,如果fragment没有通过测试,就不对它做进一步处理。alpha test是用来确保完全透明的fagment不会影响z-buffer
stencil buffer是用来记录rendered primitive的位置的离屏buffer,它通常包含8bit. Stencil buffer是一个可以生成特殊效果的强大工具。
7. double buffering
为了避免人眼看到正在被光栅化的图元,一般使用double buffering。在这个方法中,渲染发生在back buffer,当back buffer被渲染完成时,back buffer中的内容被置换到front buffer,也就是显示屏幕内容的buffer,这个交换发生在vertical retrace,即vblank(扫描点扫描完一帧后要从图像的右下角返回到图像的左上角,开始新的一帧扫描,即一帧最后一行到下一帧的第一行之间的时间)