计算机图形学中的抗锯齿

光栅化采样结果

采样是在每个像素的中心进行采样,然后判断这个像素中心是否在三角形内,如果是三角形内就对其进行上色
请添加图片描述
最终得到的效果就是由多个像素均匀的正方形像素所组成的三角形:请添加图片描述
得到的三角形有明显的锯齿(jaggies)

锯齿的由来

在光栅化的过程中,三维空间中的一条线经过MVP变换还有透视变换后显示在由一个一个像素点组成的像素点显示矩阵上,那就肯定会出现一种情况:这条线(边)在显示器像素矩阵上占据的像素点并不平滑,显示器像素矩阵是横纵排列的,如果是直线或者竖线还好,占据n行或m列像素点。如果是斜线,那就不好处理了,光栅算法最终就会处理成“楼梯”一样的像素点占用形式,如上图三角形的边所示,这边是锯齿。

采样错误引发锯齿

信号变化的速度太快(主要指高频信号变化太快),而采样的速度太慢,最终结果就是会导致采样错误。
如果不对其进行模糊处理,直接采样,就会出现下图的效果:
请添加图片描述
通过上述的采样方式就会出现锯齿状的三角形像素值总为纯红或者纯白。单纯的两种颜色在边缘发生突变,导致三角形轮廓的锯齿十分的明显。
解决方法
先对三角形进行模糊处理,然后再对其采样。
请添加图片描述
通过上述的方法可以看到采样点增加了,在边缘处有一些颜色比较淡的点。也就是在光栅化的过程中,三角形的抗锯齿边缘的像素取了介于红色和白色之间的像素值,再进行着色时,边缘的像素点为对应的中间值,能够获得更加平滑过渡的效果,起到抗锯齿的作用。

下面左图为直接采样,右图为先模糊后采样的效果:
请添加图片描述
倘若先采样后模糊得到的效果与先模糊后采样的效果如下所示请添加图片描述
先采样后模糊并不能实现抗锯齿的效果。那么问题来了:

  • 为什么采样不足会导致锯齿?
  • 为什么先模糊后采样能够抗锯齿,而先采样后模糊不行?
    这边从频域来说明问题。

频域

这里从最简单的正弦波和余弦波开始,如图所示请添加图片描述
如果把正弦和余弦的系数f考虑进去,就可以得到频率不同的正弦波和余弦波,其中f就是频率。其中,f=1/T(周期)
傅里叶变换(Fourier Transform)
傅里叶变换就是说,一个函数f(x),能够分解成许多不同的正弦波或者余弦波的和,从图中能直观看出其作用,越来越多不同频率的余弦波叠加,最后就能够得到一个近似f(x)的函数图像。
请添加图片描述
傅里叶变换的作用

  • 将信号从时域转换到频域(时域并不是说就一定是时间的信息。图像并不带任何时间的信息,但我们认为空间上的信息也算是时域,时域只是一个单纯的名字。这里指把图像从图像的空间变换到频率的空间)

在这里插入图片描述
其逆变换能够从频域变换回时域。

之前曾经提到,因为采样速度跟不上信号变化的频率,所以导致采样出错。下面这个图就能解释:
请添加图片描述
图中,垂直的虚线为采样点,绿色为函数图像,从上到下频率依次增高,黑点为在函数上采样的点,蓝色的虚线是将采样的点链接一起。
f 1 ( x ) f1(x) f1(x)中,采样点的连线比较接近原来的图像,而其他信号随着频率的升高,连起来的蓝色的虚线无法再还原成原来的函数图像。因此导致采样出错。而要解决上述采样的错误,解决办法就是在采样之前对图像进行模糊处理,既然说到模糊了,这里就需要滤波

滤波

滤波器 = 抛弃特定频率的内容
请添加图片描述
左图为原图,右图为经过傅里叶变换得到图像的频谱,中间最亮的部分为低频率范围,而边上黑色的部分为高频率范围

高通滤波器的效果与作用
在这里插入图片描述
高频信号(某一点是边界点的话,那么该点的上下、或者左右的变化就会非常大,所以该点的信号变化就会非常大。所以高频信息代表着图像的边缘)
高通滤波器能够使高频信号通过,阻断低频信号,对频谱进行逆变换得到原图,最终得到的图像只有边缘的信息。
低通滤波器的效果与作用
请添加图片描述
低通滤波器消除了图像中的高频信息,最后得到的频谱逆变换为原图后,发现原图已经是一个模糊的效果。因为高频信息代表着图像的边界以及一些更为细节的信息,如果抹去高频信息,那么图像的细节就会消除,最后得到的就是模糊的图像。

下面大概了解一下卷积定理:两个信号在时域上的卷积结果,就等价于,将两个信号转换到对应的频域,然后再用两个频谱相乘得到的结果。
下面两个方法等价:

  • 直接用卷积核在时域上进行卷积运算。
  • 先将图像通过傅里叶变换转换到频域,在将卷积核通过傅里叶变换转换到频域,并且将两个频谱相乘,最后将得到的结果通过逆傅里叶变换转换到时域。
    请添加图片描述
    上图表示了卷积运算的两种方式。看一下在频域的变换,卷积核变换到频域后只保留了低频信息,然后将两个频谱相乘,最后得到的也只有低频信息,再对其进行逆傅里叶变换,最终就得到了一个模糊的图像。

采样 = 重复 频率的内容 (Sampling = Repeating Frequency Contents)

请添加图片描述
上图a是一个连续函数的图像,b是a对应的频域的图像。我们要对函数a进行采样,如何进行采样呢?采样就是对函数进行离散化的过程,只保留函数上某些特定位置的函数值,其余不要。这就相当于 一个函数× 另一个函数。 反应到上图就是 a × c(c是冲激函数), 得到的结果e就是对a采样的结果,可以看到这个采样能够还原函数a的图像。
我们说,时域上的乘积 = 频域上的卷积,也就是说我在时域上对 a×c的操作,在频域上要把b和d进行卷积。b卷积d的结果就是f,就可以发现在时域上对一个连续函数进行采样,而在频域上,则是对该连续函数的频谱进行了一个复制粘贴的操作。所以说采样是什么,采样就是重复一个原始信号的频谱。也就是说在时域上进行采样 等价于 在频域上进行周期延拓。

走样 = 频率内容混合 (Aliasing = Mixed Frequency Contents)

请添加图片描述
采样不同的间隔,会影响频谱会以另外一种间隔移动。图中第一行,进行密集的采样时,频谱的移动范围间隔较大,能够保证各个频段分隔不会相互影响。而在下面的第二行中,当采样的频率不够时,频谱的移动范围就会变小,最终导致频谱混叠,这种情况下就发生了走样。

反走样(Antiliasing)

1.提高采样率
2.先把一个信号的高频信息抹除在采样
请添加图片描述
在采样之前,先用滤波器(虚线框)抹除掉高频率的信息,然后再对图像进行采样。可以看到,如果不用滤波器进行滤波,那么就会像之前一样,在高频段的部分会导致频谱的叠加,然后发生走样。用滤波器进行滤波之后,就不会在发生频谱的叠加,也就减少了走样。
先模糊 再采样 = 抗走样,使用该方法得到的结果如图所示:
请添加图片描述
计算平均像素值实现抗走样
对于任何一个像素,被三角形覆盖的情况只有三种:1.完全被覆盖 2. 完全不被覆盖 3.部分被覆盖
在这里插入图片描述

超级采样反走样方法(Super-Sampled Anti-Aliasing ,SSAA)

通过以更高的分辨率来采样图形,然后再显示在低分辨率的设备上,从而减少失真的方法。例如下面的图形表示了增加分辨率后,绘制直线的差别。
请添加图片描述
通过将高分辨率的图像,显示在低分辨率的设备上,确实能有效减轻走样现象,但是存在的弊端就是,要为这些多出来的像素,进行更多的计算,以及内存开销很大。这是一种比较传统的方法。

多重采样反走样方法(Multi-Sampled Anti-Aliasing, MSAA)

按照上面的那种求每个像素中的区域百分比十分困难,所以就有了MSAA这种反走样的方法,其思想也是如上面的那种方法,但是取的是一个近似的求区域像素平均值的方法。具体的做法如下:
将一个像素划分为 4*4个小像素,每一个小像素都有一个像素中心,然后可以对这个小像素进行采样,判断这些小像素在不在三角形内,然后将最后的结果平均起来,就能够求的三角形对一个像素的区域的近似的覆盖。
假如把一个像素分为四个小像素,在像素内部多加一些采样点
请添加图片描述
然后每个点都可以判断是否在三角形内,如果四个点都在三角形内就是100%覆盖,如果只有三个点在三角形内,则三角形对这个像素就是75%覆盖。于是就可以得出每个像素的覆盖结果
在这里插入图片描述
注意:MSAA通过更多的样本,来近似的进行反走样的第一步,模糊,这个过程。糊完了之后就相当于每一个像素内部都已经知道了三角形的覆盖率,求了平均之后是什么,就会得到上图的结果。
MSAA的过程:
将每个像素划分为多个小像素
判断每个小像素的中心是否在三角形内部,从而得到三角形在该像素的覆盖率
得到覆盖率之后对这个像素的像素值进行平均,得到上图的结果
然后采样
注意: MSAA并不是通过提高采样率而完成的,对更多的点进行采样是为了得到三角形在一个像素上的覆盖比率而已。
MSAA的缺陷
MSAA提高了计算的量,将一个像素划分为多个区域,就要对每个区域进行多次计算,最后就提高了计算的成本。

其他反走样方法

FXAA (Fast Approximate AA)
TAA (Temporal AA)

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LV小猪精

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值