这是渲染管线中vertex-processing的下一步,主要包含两个部分,第一个部分是enumerate,第二个部分是interpolate,当然这只是截取了虎书中对于这个两个步骤的描述中的两个词来代表它们。
"For each primitive that comes in,the rasterizer has tow jobs:it enumerates the pixels that are covered by the primitive and it interpolates valuses,called attributes,across the primitive -the purpose for these attributes will be clear with later examples."
enumerate:enumerates the pixels that are covered by the primitive 这一步指的是:枚举那些被图元覆盖的像素
interpolate:interpolates valuses,called attributes,across the primitive 这一步指的是:根据图元通过插值计算属性,在games101中,这一步应该被成为shading。
那么我们同样按照这样的顺序来描述渲染管线。
首先我们讨论enumerate的问题。
games101中可能由于时间的关系只讲了三角形的部分,也就是triangle rasterization,但是在虎书中还提到了另外一种line drawing,这个在后面的光线追踪中有提到。
那么首先来讨论line drawing
其实这部分是很简单的,当然为了严谨起见,虎书花了还是挺长的一段来讨论这个问题,顺便的提出了一种增量算法,用来在line的数量不是很多的时候优化本来的line drawing算法。
回到line drawing本身,在我看来这部分的关键思想在于通过直线的斜率来判断下一个像素可能的位置,如果斜率大于0且小于1,下一个像素可能的位置只有当前像素的右方,或者当前像素的右上方,同时设置一种条件来判断到底是往哪个方向,这一点我们在下面更加具体的分类讨论中会提到。
这里的讨论有一个前提,那就是都是从右往左画线,如果开始给出的两个点的顺序不满足这个条件,那就交换它们,在平面上不相同的两个点总是可以分出左右关系的。
虎书中的算法很聪明的将直线分为四种:
1.斜率大于0小于1的(0,1)
2.斜率大于0且大于1的(1,+无穷)
3.斜率小于0且小于-1的(-无穷,-1)
4.斜率小于0且大于-1的(-1,0)
这里的y1,y0,x1,x0是一开始我们用来定义该直线的两个点。
情况1时,这个时候我们考虑这条直线,由于已经知道斜率的范围,我们可以预测下一个像素的位置,是向右或者右上方,因为此时直线与x轴正半轴的夹角在(0°,45°)之间,介于右方和右上方之间。
四个情况同理,整理一下就是这样的情况:
1.斜率大于0小于1的(0,1) 右方/右上方
2.斜率大于0且大于1的(1,+无穷) 上方/右上方
3.斜率小于0且小于-1的(-无穷,-1)下方/右下方
4.斜率小于0且大于-1的(-1,0) 右方/右下方
那么接下来的问题是如何判断下一个像素到底是取哪个方向。
这里虎书给出了一种比较直观的方法。找到两个可能的像素的对应坐标的中线,看看中点的情况。
还是以情况1举例。
找到(x+1,y+0.5),判断该点在直线的上方亦或是下方。这里的直线使用的是f(x,y)=0的方程的形式,
所以实际上如果在这样的情况下,相当于中点在直线的下方,自然,我们选择右上方的像素。
其他的四种情况和情况1差距不大。
接下来是triangle rasterization
对于三角形来说,其实主要的问题在于三角形的边界上,内部的处理是较为简单的,在后面一步的通过插值着色上。
那么在这个阶段我们主要讨论的是如何处理三角形的边界,首先要明确的是我们处理的是相邻的三角形,这样就会出现公用一条边的情况。
咳咳,这个,三角形的光栅化,在我阅读虎书的过程中,发现出了一点小问题,可能需要补一下前面的基础,这一次的笔记整理就先到这里。