光栅化本质说白了就是填充一个三角形而已,各类3D模型的图元(基础组成3d模型的最小单位)为三角形,三角形填充完毕,就完成了光栅化。
那就先从2d的三角形填充说起吧,三角形就这几种
三角形类型那怎么填充呢?扫描填充喽
待填充三角形用一个平底三角形简单讲解下,咋填充,y方向步长1前进,一行行来呗,平底三角形 y1 = y2, 要扫描多少行?y1-y0不就中了,为啥底下减去上边的,因为屏幕显示的时候一般设定左上角为坐标原点,y向下增长,x向右增长,就酱紫>_>。
言归正传,那咋算XL,XR, 简单来说,你上过高中就应该学过通过两点确定一条直线的方程吧, P0, P1是一条直线, P0, P2又是一条直线,通过两点算出两条线段y = kx+b, 起点P0你知道了对吧,每次y0+1,还算不出XL, XR对应的x吗,XL到XR就是一条扫描线,y值一样, 一个个点填充完了, 一条线不就完事了吗? 其实也有更好的其它推理方式,我此处写的简单些。来看下图。
其它类型三角形上图重点在哪?在于切割,怎么切割?首先确定不是平顶或平底的三角形,然后把三个点排好,所谓排好嘛意思?就是通过三个点的坐标让程序知道在y方向上中间的那个点, 而且要知道那个点是左边还是右边,上图很明显,是左边嘛。那怎么做呢?自己if else撸代码去。。。
好的,那么现在我们完成了一个三角形的填充,这是一个2d的三角形,而且扫面线颜色十分单一,那么我们拓展一下,一个3d模型是由无数个3d的面组成的,每个3d的面是个三角形,那是不是把每个3d的三角形填充满了就可以绘制出一个模型了呢?那么就开始吧,
像写代码一样:
第一步:是确定3d三角形的三个顶点的坐标位置。
第二步:分割3d空间中的三角形,至于是否分割,取决于这个三角形是否是平底三角形嘛。是的话,不分割。不是的话分割,熟悉编程的朋友应该知道了,这是一个函数就可以解决的问题喽。
第三步:计算每条扫描线的起始坐标和终止坐标,这样每条线去扫描写入指定位置,每条线内部又是逐个点去填充。
粗略来说这样一个三角形就算填充完毕了。好,我们把这三步简单说了一下,下边开始正题,细化每一步去实现。
网友评论