现代计算机图形学

反走样(Antialiasing)

当我们完成光栅化(Rasterizer)后,我们将会得到一个能在屏幕空间中显示的图案。这个图案的形状类似于三角形,但现在它的三条边都有着很严重的锯齿现象,不符合我们的预期。这就需要使用到我们今天要讲的 反走样(Antialiasing) 技术,也就是俗称的 抗锯齿

image-20230926144038577

image-20230926150732851

走样原因概述

要将物体显示到屏幕上,就一定需要进行采样(Sampling)。而如果我们的 采样速率 < 信号改变频率,就会出现 走样(Aliasing)

不同走样形式的产生原因:

  • 锯齿(Jaggies)—— sampling in sapce
  • 摩尔纹(Moire)—— undersampling images
  • 车轮现象(Wagon wheel effect)—— sampling in time

如何做反走样

对原始图像进行 模糊/滤波(Pre-Filtering)

滤波操作概述

通俗的讲,就是在我们在采样之前,先对原始图片进行模糊处理,再进行采样。

image-20230926145033138

使用滤波法(Pre-Filtering)进行反走样

注意反走样(Antialiasing)后,已光栅化三角形的边缘,其中像素的颜色灰度值是中间值。

前后对比

对比下面两张图片,可以明显看出,反走样后的锯齿现象明显的弱了很多。

image-20230926150732851

image-20231001170358233

反走样前 vs 反走样后

将滤波与采样的步骤调换的猜想

那么我们能否在 采样 后再进行 滤波/模糊 处理呢?答案是不行。

先采样再处理的操作有个学名叫做 Blurred Aliasing,这样的操作依然是走样的,只不过走样之后又被模糊了。对比下图可以发现 Blurred Aliasing 所得结果远不如 Antialiasing。

image-20231001171713126

先滤再采和先采再滤的对比

疑问

  • 为什么 欠采样(Undersampling)会导致 走样(Aliasing)?
  • 为什么在 采样(Sampling) 前 滤波/模糊(Pre-filtering)就可以进行反走样(抗锯齿)?

让我们继续深入挖掘最基础的原因,看看抗锯齿的光栅化要如何进行。

频域(Frequency Domain)

前置知识

  • 简单的三角函数

image-20231002175849653

  • 频率周期

image-20231002180248073

  • 傅里叶级数展开

​ 定义:将函数表示为 sin 和 cos 的加权和。

image-20231002181717784

​ 由此可知,任意一个周期函数都可以由 不同频率 的 sin/cos 周期函数表示

图像的表示

我们都知道,图像是由像素组成。而每一个像素的颜色,可以用红、绿、蓝、透明度四个值表示,大小范围都是0 ~ 255。如果把每一行所有像素的红、绿、蓝的数值,依次画成三条曲线,就得到下面的图像。

img

​ 可以看到,每条曲线都在不停的上下波动。有些区域的波动比较小,有些区域突然出现了大幅波动(比如 54 和 324 这两点)。对比一下图像就能发现,曲线波动较大的地方,也是图像出现突变的地方。这说明波动与图像是紧密关联的。图像本质上就是各种色彩波的叠加。

img

​ 所以,色彩剧烈变化的地方,就是图像的高频区域;色彩稳定平滑的地方,就是低频区域

傅里叶变换(Fourier Transform)

​ 傅里叶变换做的事情,就是将信号分解为频率。

​ 给定任何一个函数,经过复杂的傅里叶变换,可以得到另一个函数。同样的,得到的函数经过逆傅里叶变换,可以得到原函数。

image-20231002182950918

傅里叶变换 与 逆傅里叶变换

走样原因深度分析

​ 根据上面的知识点,我们就可以分析出 走样(Aliasing) 的原因。

​ 首先,图像在计算机中是以波的形式进行记录,而根据傅里叶级数,一个波可以由任意个 不同频率 的 sin/cos函数 组成。此时,我们对这些分解而成的波进行采样,高频率的波就会出现非常明显的走样现象。

​ 因此在采样后,重新组合而成的波形会因为高频率波的走样现象,而发生严重的走样。

image-20231002192629421

高频率的波走样严重

​ 由此可知,我们可以通过剔除高频率的波,也就是俗称的 低通滤波(low-pass filtering),以达到 反走样(Antialiasing) 的效果。且因为图像中高频段的波是在表示图像的轮廓,因此所得的图象是一个模糊的样子,所以 滤波处理 又被俗称为 模糊处理

img

低通(low-pass)滤波后图像变得模糊

​ 分析完原因后,就可以大致回答我们之前的疑问:

  • 为什么 欠采样(Undersampling)会导致 走样(Aliasing)?

    • 因为 欠采样 会导致高频段的波走样严重,从而导致整体走样。
  • 为什么在 采样(Sampling) 前 滤波/模糊(Pre-filtering)就可以进行反走样(抗锯齿)?

    • 低通滤波可以剔除高频段的波,也就是剔除了部分走样严重的波,可以一定程度上实现反走样;而先采样后滤波,通俗理解就是对 边界已经产生走样的图片 进行 模糊边界 的处理,其结果依旧是已经走样的图片。

反走样方法详细介绍

​ 在游戏中,成熟的反走样方法有很多,例如:MSAA/TAA 等。本文着重学习反走样的方法,因此重点介绍 Pre-Filtering 和MSAA两种常见的反走样方法。

Pre-Filtering

​ 一个像素中可能会被界限分明的划分为两个区域,如果此时中心点取到其中一种颜色上,那么另一种颜色就有可能丢失,从而导致走样。

​ 既然如此,我们只需要将这个像素中的颜色混合均匀,再选择像素的中心点进行采样就好了。

具体操作

  • 卷积(Convolve):使用 低通滤波器(low-pass Filter) 对每一个像素进行 卷积(Convolve) ,通俗的讲就是对一个像素内部进行平均,使得图像达到模糊的效果。

image-20231003141949688

对一个像素进行 卷积/平均

  • 采样(Sample):对像素的中心点进行采样。

优缺点

  • 优点

​ 能够准确地近似表示一个像素的应该呈现的颜色,拥有较好的反走样效果。

  • 缺点

​ 计算一个像素内的色彩比例时较为麻烦。

Antialiasing By Supersampling(MSAA)

​ 我们已经知道,Pre-Filtering 反走样方法在计算一个像素内的色彩比例时,需要比较复杂的计算。如果屏幕像素增多、或是图像变得复杂,则很可能会导致渲染较为缓慢。

​ 为了解决这一问题,前人想出了一个近似方案,就是在一个像素内设置四个采样点,再平均这四个采样点获得的数据,决定最后该像素显示的颜色。人们根据这一方法的采样方式,给其起名为 超采样反走样法(Multisample Antialiasing),简称 MSAA .

具体操作

image-20231003150030724

image-20231003150105944

优缺点

  • 优点

​ 有较好的反走样效果,但因为是 Pre-Filtering 的近似,效果肯定不如真正的 Pre-Filtering 方法。

  • 缺点

​ 相比于单采样,采样的数据量大大增加。

其他反走样方法

​ 现代计算机图形学还常使用以下反走样方法:

  • FXAA(Fast Approximate AA)
  • TAA(Temporal AA)

​ 这些方法都得到工业界的广泛使用。

参考资料

图像与滤波

现代计算机图形学入门——Antialiasing