快速抗锯齿线图


11

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


1
有几个问题……您是在CPU还是GPU上执行绘图逻辑?另外,您是否正在寻找基于整数的算法或浮点数?
艾伦·沃尔夫

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

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

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

2
不过,我无法将评论标记为正确。
2015年

Answers:


9

有没有类似的快速方法来绘制抗锯齿线?

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


在软件光栅化器中,绘制抗锯齿线的普遍方法是吴小林的线算法。实施起来并不难,并且无论如何,该链接上都有异常高质量的伪代码。

在硬件栅格管道中,默认的(或用户提供的)几何着色器将线图元扩展为屏幕空间四边形,然后绘制为两个三角形,然后可以按常规方式对它们进行抗锯齿处理。

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


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

@Octopus [表达含糊的怀疑态度,尤其是对较快的观点表示怀疑,但是缺乏反驳或确认的语境-如果是这样,当然也欢迎消息来源,更正和修改。]
imallett

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

1
但是我确实同意@Octopus,甚至接受“从一端到另一端绘制”,只有在始终使用整数算术的情况下,伪代码才是Wu的算法。我在网上看到的代码使用浮点算法,这是一个很大的变化。在Wu的论文中,该算法仅使用整数算法(或实际上是定点算法)。
扬-奥克·拉松
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.