[从零构建光栅渲染器] 1.Bresenham 画线算法

非常感谢和推荐Sokolov的教程,Sokolov使用500行C++代码实现一个光栅渲染器。教程学习过程非常平滑,从画点、线和三角形开始教学,在逐步深入三维变换,投影,再到顶点着色器,片段着色器等等。教程地址:https://github.com/ssloy/tinyrenderer。Sokolov的教程为英文,我翻译了其文章。

在学习过程中,有些内容可能您可能云里雾里,这时就需要查阅《计算机图形学》的书籍了,这里面的算法和公式可以帮助您理解代码。

作者:尹豆(憨豆酒),联系我yindou97@163.com,熟悉图形学,图像处理领域,本章代码: https://github.com/douysu/computer-graphics-notes

本章运行结果

第一次尝试

第一课的目标是渲染一个线形网格。为了画它,我们应该先学习如何去绘制线段。我们可以简单阅读以下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
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值