抗锯齿算法?

时间:2010-06-10 02:32:38

标签: c++ c algorithm antialiasing

我有正在创建的纹理,并希望对它们进行抗锯齿处理。我可以访问每个像素的颜色,鉴于此我怎样才能对整个纹理进行抗锯齿?

由于

4 个答案:

答案 0 :(得分:6)

我很抱歉,但真正的抗锯齿并不在于如上所述从邻居那里获得平均颜色。这无疑会使边缘变得柔和,但它不是抗锯齿而是模糊。真正的抗锯齿在位图上无法正确完成,因为它必须在绘制时计算,以确定哪些像素和/或边必须“软化”,哪些必须不被“软化”。例如:假设您绘制的水平线必须正好为1像素(例如“高”),并且必须精确地放置在整数屏幕行坐标上。显然,你会想要它是未经过深化的,并且正确的抗锯齿算法会做到这一点,将你的线描绘成完美的背景色像素包围的完美行像素,完全没有色调混合。但是如果你绘制它(即位图)后使用相同的线并应用平均方法,你会在线的上方和下方模糊,导致3像素厚的水平线,这不是目标。当然,一切都可以通过正确的编码来实现,但是来自一种非常不同且更复杂的方法。

答案 1 :(得分:5)

“抗锯齿”可以指广泛的不同技术。这些通常都不会提前做到纹理。

也许你的意思是mip-mapping? http://en.wikipedia.org/wiki/Mipmap

答案 2 :(得分:5)

抗锯齿的基本方法是:对于像素P,对其周围的像素进行采样。 P的新颜色是其原始颜色与样本的平均颜色。

您可以采样更多或更少的像素,更改要采样的像素周围区域的大小,或随机选择要采样的像素。

正如其他人所说的那样:抗锯齿并不是对已经是像素位图的图像所做的事情。这是一种在2D / 3D渲染引擎中实现的技术。

答案 3 :(得分:1)

用这种模糊的方式询问抗锯齿问题并不是很有意义。这一切都取决于纹理的性质以及它们的使用方式。

一般情况下,如果您无法控制显示环境,并且您的纹理可能会缩放,旋转或与其他元素合成而您无法控制,则应使用透明度指示图像的结束位置并且它只是部分填充像素。

通常,避免使用相对于可能进行的缩放量较小的锐边和特征也是一件好事。