系列教程4: 光栅化和Z-Buffer
我们跳过教程3,因为教程3主要是教我们加载Blender导出的模型网格。我们暂时不需要去做这些工作。依然以cube为例足以。
到目前为止,我们的渲染函数可以进行简单的线框渲染。我们现在开始看看如何用光栅化算法来填充三角形。然后,我们将看到如何用Z-buffer来避免将模型背面的面绘制到前面。
光栅化
有太多不同类型的光栅化算法了。我们将在这个教程实现一个简单但是有效的光栅化算法。由于我们在CPU上运行我们的3D Soft Engine,我们必须对这部分有更多的关注。的确,它会消耗大量的CPU。而这重要的部分在今天都是由GPU来完成。
让我们开始一个练习。拿一张纸,开始画你能想到的所有三角形的类型。这个主意是为了找到一个通用的方法来绘制任意类型的三角形。
如果我们对三个顶点以y坐标的方式进行排序,即P1,P2,P3。我们最后只会有2种可能:
你会看到2种可能:P2在P1P3的右边 、 P2在P1P3的左边。在我们这个例子中,我们想要总是从左到右来绘制我们的线,从sx到ex。
此外,我们会通过移动P1.Y到P3.Y来绘制从左到右的线条。但是我们需要改变我们的逻辑当到达P2的时候,因为在这2种情况中,斜率都发生了改变。这就是为什么我们需要2步来完成绘制这个三角形。从上往下从P1.Y到P2.Y,然后从P2.Y到P3.Y,我们最终的目标。
如何完成我们的算法所需要理解的逻辑都在维基百科中: http://en.wikipedia.org/wiki/Slope
这真的只是一些基础的数学知识。
为了对case1和case2进行排序,你需要简单的计算一下斜率的倒数:
dP1P2 = P2.X - P1.X / P2.Y - P1.Y and dP1P3 = P3.X - P1.X / P3.Y - P1.Y
如果dP1P2 > dP1P3 则是第一个例子,即P2在右边。否则如果dP1P2 < dP1P3,则是第二个例子,即P2在左边。
现在我们有了算法的基本逻辑