前言
本系列最终是要去绘制mesh的,既然这样我们就需要从最简单的开始,先绘制直线。
我们都知道有个算法-Bresenham’s Line Drawing Algorithm。但是为什么要用它,这个才是我们要讲的。
参考
gamma公式
本系列主要参考Dmitry V. Sokolov的软渲染教程,详细教程可阅读参考链接
一、最简单绘制直线的方法
说起直线,我的第一想法就是直线方程
y = k x + b y = kx+b y=kx+b
但是直接利用直线方程,然后直接去编写代码还其实挺困难的,我们先换一种方式考虑。
1.1 向量
向量可以被拆分成两条向量的和
那么我们利用这个性质就可以写出这么一段代码
for (float t=0.; t<1.; t+=.000001)
{
int x = x0 + (x1 - x0) * t;
int y = y0 + (y1 - y0) * t;
image.set(x, y, color);
}
这段代码非常简单,可以绘制任何方向上的直线,但是有个致命问题,就是非常消耗性能。t
这个变量的取值决定了循环的次数,同时也影响了直线的连续性。因此我们必须改造这个方法。
二、Bresenham’s Line Drawing Algorithm
我对该算法的理解就是-只有加减法的算法
2.1 屏幕是离散的
注意以下只考虑第一象限,其他象限通过交换值即可解决
我们知道直线是连续的,但是我们的屏幕并非连续的,而是离散的,像素点之间是有1px
距离的。
上面说了,直线其实是可以被拆开的,那么我们只让某一个轴进行递增,另外一轴跟着递增不就行了么,那么现在我们就可以去掉循环条件