由于图形信号的连续性,当我们想要在光栅显示器上显示图形时,在处理非水平、非垂直且非45°的线段时,直线段或边界会出现锯齿。这是因为光栅显示系统中,使用离散的像素点来显示的图像。因此若我们的像素越大那么锯齿也就越大越明显,像素越小锯齿也就越小越不明显。这是因为我们在光栅化操作时,采样的是像素的中心点。像素的中心点越密集,也就是说我们的采样频率越高。也就是说锯齿出现的原因是因为我们的采样频率不够高。
这种用离散量表示连续量引起的失真现象称之为走样(aliasing);用于减少走样现象的技术称为反走样(antialiasing)。光栅图形的走样现象除了产生锯齿形的边界外,还有微小图形闪烁,甚至遗失等现象。走样是光栅扫描显示器的一种固有现象,因此我们只能使用反走样方法来尽可能减少对图形显示的影响。
常用的反走样技术主要分为两类:一类是通过提高硬件设备,提高显示器分辨率。另一类通过改进算法来实现。
硬件技术
采用分辨率更高的显示设备时,可使锯齿相对于图形物体更小一些,所以看上去走样现象有所改善。但是具有局限性,由于受到硬件条件和成本的限制,实现起来较为困难。
软件技术
1、区域采样
根据计算像素区域中被物体覆盖的比率来更改像素点的颜色。或将像素点分割为更小的子像素,通过计算子像素落在直线内部的比例从而得到近似面积。
缺点:需要直接计算相交区域的面积,乘法运算运算量大,且得到的反走样图像不是很平顺,效果不如加权反走样方法获得的图像。
2、加权区域采样
软件反走样技术主要使用加权区域采样。算法的实质是利用人眼视觉特性,这种方法更符合人视觉系统对图像信息的处理方式。把待处理的直线段看作具有一个形状狭长的矩形,并设计算法求出该矩形与某象素区域相交区域的面积,根据该区域与象素中心的距离确定该象素的亮度值
通过加权平均的方法,调节周边像素的亮度和灰度,以产生模糊的边界。通过模糊,我们可以淡化锯齿,从而达到更平滑的视觉效果。加权参数可以选择距离、面积和体积等。比如在白色背景下绘制黑色直线时,可以通过在直线周围添加一些灰色像素来柔化黑色到白色的锐变。
离散计算方法
- 将象素分割成n个等面积的子象素,计算每个子象素对原象素的贡献,并保存在一张二维的加权表中;
- 求出所有中心落于直线段内的子象素;
- 计算所有这些子象素对原象素亮度贡献之和的值;
- 该值乘以象素的最大灰度值作为该象素的显示灰度值。
下面是我在课程中编写的画直线程序相关的抗锯齿代码分享:
走样直线 反走样直线
反走样算法实现
文章参考:GAMES101-现代计算机图形学入门-闫令琪_哔哩哔哩_bilibili
处理反走样常用的四种技术_Hydrion-Qlz的博客-CSDN博客
此篇仅作为一个图形学笔记整理,用于分享和加深记忆,内容也不够深入,希望能对大家的理解有所帮助。如果哪里写的有误欢迎大家指出