前言:图形学第三弹,这可能是一个最简单的 3d 到 2d 的转换算法。
先上图
之前我们只是将所有的三角形画了出来,没有考虑哪些点应该在前面、哪些点应该在后面
也就是说,z 大的点应该遮住 z 小的点。
所以难点就是,我们只知道三角形的边,而不知道三角形内部点的 z 的大小。
在上一篇文章的最后一部分,我们换了一个思路去画填充三角形。
我们可以通过重心法求出某点是否在这个三角形里面。重心法计算了的 u,v 值。
假设 ABC 是三角形的三个顶点,P 点是待计算的点
这个值同样可以用来计算 z 的大小。
代码(不完全)
// pts[i][2] 是 z 的值。
// bc_screen[i] 分别是计算出的参数
for (int i=0; i<3; i++) P.z += pts[i][2]*bc_screen[i];
// 计算后就可以得到 z 的值
叙述整个算法
假设图片大小是 width × height。也就是有width × height 个像素。
用 zbuffer[width × height] 存储每一个要画像素的 z 值,初始化为无穷小
输入三角形的三条边,遍历三角形内部的所有点。如果内部点的 z 大于zbuffer 的值更新 zbuffer 并画点。达到在上面的像素覆盖之前像素的目的。
重复上述操作,直到遍历完所有的三角形