Bresenham的直线算法是一种仅使用快速整数运算(加,减和2乘)绘制直线的方法。但是,它会生成锯齿线。有没有类似的快速绘制抗锯齿线的方法?

评论

有几个问题……您是否正在CPU或GPU上执行绘制逻辑?另外,您是否正在寻找基于整数的算法或浮点数?

@ AlanWolfe,CPU上的整数算法-与Bresenham算法所设计的环境相同。

en.wikipedia.org/wiki/Xiaolin_Wu%27s_line_algorithm是经典的一本书,尽管Wikipedia页面是半生不熟的,而且我无权访问该论文。不过,这似乎是一个懒惰的问题,因为通过进行一些基本的谷歌搜索很容易找到这个问题。

只是大声思考,我认为使Bresenham适应绘制多像素厚的线条应该很容易。然后,您可以通过计算每个像素中心距数学理想线的距离并应用一些衰减函数来进行抗锯齿。

我无法将评论标记为正确。

#1 楼


是否有一种类似的快速绘制抗锯齿线的方法?


不,因为根据定义,抗锯齿线会接触更多像素。这样的算法会比较慢。


在软件光栅化器中,绘制抗锯齿线的普遍方法是Wu Xiaolin Wu的线算法。实施起来并不难,而且在该链接处反而会出现异常高质量的伪代码。

在硬件栅格管道中,默认情况下(或用户-几何着色器,然后绘制为两个三角形,然后可以按照通常的方式进行抗锯齿处理。

在raytracer中,有多种选择。值得思考的是您实际如何绘制一维对象。也许是个圆柱体(呜呜的影子!)。请注意,这会引入透视/缩短的问题,这些问题可能是(或可能不是)您想要的。没有明确的概括。然后,显然,无论您做什么,都只需对其进行超采样。

评论


$ \ begingroup $
“无论如何,在那个链接上都有异常高质量的伪代码”,我不同意。该伪代码可能似乎不是Wu算法的正确实现,尽管它似乎是网络上无数地方使用的伪代码。 Wu的原始算法从两端向内延伸到中心,实际上比Bresenham的算法快,因为即使写入更多像素,它也执行大约一半的操作。我说的是Wu的实际算法,而不是链接的维基百科文章中发布的算法。
$ \ endgroup $
–章鱼
17年6月16日在16:37



$ \ begingroup $
@Octopus [表达含糊的怀疑态度,尤其是对较快的观点表示怀疑,但缺乏反驳或确认的语境-如果是这样,当然也欢迎提供资料,更正和编辑。
$ \ endgroup $
–imallett
17年6月18日在23:31

$ \ begingroup $
取决于您的计数。如果从两端向内绘制,那么Wu的算法将完成一半的计算,但像素写入的次数将增加一倍。参见Wu的论文中的表1,链接到Wikipedia。因此,如果像素写入非常昂贵(例如在串行连接上写入TFT的情况下),那么Wu的算法比Bresenham的算法更昂贵。 (我必须承认,我不明白为什么布雷森汉姆的算法也不能使用对称性。)
$ \ endgroup $
–Jan-ÅkeLarsson
19年8月13日在14:05

$ \ begingroup $
但是我确实同意@Octopus,甚至接受“从一端到另一端绘制”,只有在整个过程中都使用整数算术的情况下,伪代码才是Wu的算法。我在网上看到的代码使用浮点算法,这是一个重大变化。在Wu的论文中,该算法仅使用整数算法(或实际上是定点算法)。
$ \ endgroup $
–Jan-ÅkeLarsson
19年8月13日在15:54