非常感谢和推荐Sokolov的教程,Sokolov使用500行C++代码实现一个光栅渲染器。教程学习过程非常平滑,从画点、线和三角形开始教学,在逐步深入三维变换,投影,再到顶点着色器,片段着色器等等。教程地址:https://github.com/ssloy/tinyrenderer。Sokolov的教程为英文,我翻译了其文章。
在学习过程中,有些内容可能您可能云里雾里,这时就需要查阅《计算机图形学》的书籍了,这里面的算法和公式可以帮助您理解代码。
作者:尹豆(憨豆酒),联系我yindou97@163.com,熟悉图形学,图像处理领域,本章代码: https://github.com/douysu/computer-graphics-notes
本章运行结果
![](https://i-blog.csdnimg.cn/blog_migrate/83dc8f8bdcfcfe671f5ddf495b8cc3c6.png)
第一次尝试
第一课的目标是渲染一个线形网格。为了画它,我们应该先学习如何去绘制线段。我们可以简单阅读以下Bresenham画线算法,但是让我们自己来写代码。应该怎么写一个从点(x0, y0)到点(x1, y1)的线段呢?
可以这样:
void line(int x0, int y0, int x1, int y1, TGAImage &image, TGAColor color) {
for (float t=0.; t<1.; t+=.01) {
int x = x0 + (x1-x0)*t;
int y = y0 + (y1-y0)*t;
image.set(x, y, color);
}
}
代码在这里可以找到here
第二次尝试
上面的代码问题是变量的选择(当然还有效率不高的问题)。我上面是让等于.01,如果改成.1,线段会成这样:
我们可以轻松找到其中重要的地方:仅仅是绘制像素的数目不同(第一次绘制的像素数目多,改变常量为.1后,绘制的像素变少),一种简单的方法如下:(其实不好的,错误的)
void line(int x0, int y0, int x1, int y1, TGAImage &image, TGAColor color