抗锯齿

锯齿

锯齿就是采样瑕疵。

走样:锯齿
反走样:抗锯齿

采样瑕疵的表现

1.锯齿

2.摩尔纹

3.车轮效应

瑕疵产生的原因

信号变化的太快,采样太慢

反走样的步骤

先将图像进行模糊,再进行采样

不能先采样,再模糊

频域

频域是描述信号在频率方面特性时用到的一种坐标系。
自变量是频率,即横轴是频率,纵轴是频率信号的幅度,即通常说的频谱图。

傅里叶级数与傅里叶变换

任意周期函数都可以用正弦函数和余弦函数构成的无穷级数来表示。

下图分别是频率为1和频率为2的时域图像

傅里叶变换:将函数从时域转换到频域

逆傅里叶变换:将函数从频域转换到时域

图像的频域

将图像从时域变换到频域后,会形成一张衍射图
其中低频部分集中在图像正中间,而高频部分分布在周围,且离图像中心越远,频率越高。
可以将图形的频率理解为图像颜色变换的剧烈程度,越剧烈,即颜色变化越大,频率越高;越平缓,即颜色相近,频率越低。
低频决定轮廓,高频决定细节。

高通滤波

除去低频部分,只保留高频,即只保留图片中颜色变化大的部分,也就是物体的轮廓

低通滤波

除去高频部分,只保留低频,即只保留图片中颜色变化小的部分,也就是是物体轮廓的颜色变化变得不剧烈,也就是模糊了物体边缘。

卷积

图像卷积

卷积核:一个小的矩阵

卷积就是将卷积核放在图像中,然后将卷积核所覆盖的像素颜色值乘以卷积核中的数值,即权重,然后将得到的数值相加,再进行归一化(平均),就能得到该像素经过卷积后的图像。

卷积实际就是将一个像素对周围的像素求平均,而卷积核就是具体用何种算法进行求平均。

常见的卷积核有矩形卷积核、线性卷积核、B样条卷积核、高斯卷积核等

卷积的时域

时域上的卷积就是频域上的乘积

将卷积核进行傅里叶变换转换到时域图像可以发现,图像中大部分都是低频信号。将图形在时域上进行卷积其实就是在频域上进行低通滤波,所以卷积核也就是低通滤波器。

卷积核面积越大,其求平均时所平均的像素就越多,所以图像越模糊,也就是图像频域保留的高频信号越少,所以可得卷积核的频域面积越小。

反走样

走样原因

采样频率太慢,跟不上频率

从频率角度定义:不同的频率在采样后的频率可能相同,无法区别出采样相同的不同频率

在将采样转换回图像时,原本的高频信号会被识别成低频信号,也就是放大了低频信号,这里称为混叠。(上图中的中高频的f5在采样后变成了低频(蓝色虚线))

锯齿产生的原因:
1.三角形边缘的频率很高,但是采样频率(近似为分辨率)过低,无法采集该高频率信号,并将其识别为了低频信号
2.部分白色被识别成了红色,部分红色被识别成了白色。

反走样

在低采样频率时,无法采样高频信号,而且高频信号会被识别成低频信号从而造成混叠。所以可以在进行采样前将高频信号去除,然后再采样。
就相当于让三角形的边缘不再那么锐利,从而使得采样时能够正确处理三角形边缘。
在去除高频信号时,就要用到上面的低通滤波器。

上文提到不能先采样,再模糊,是因为采样部分采集了高频信号并转化成了低频信号,再进行模糊也无法消除混叠产生的锯齿。

其他反走样方法

MSAA

通过超级采样进行抗锯齿

将一个像素分为多个像素,求出每个子像素的颜色后进行平均,得到该像素的颜色值。

这样会导致计算量的大量增加。

工业上通常不会用规整图形来划分像素,并且像素相邻部分的子像素会为复用以降低计算量。

FXAA

在采样阶段不进行任何抗锯齿的操作,而在画面生成结束后用固定的模版匹配画面中的锯齿,然后将锯齿像素替换掉。

该算法速度快,计算量小,但是部分场景下效果不好。

TAA

分析前面多帧的画面,计算像素的平均颜色。

深度测试

画家算法

先光栅化远处的物体,再画近处的物体。先画模型的远处的面,再画近处的面。

但无法处理以下图形:

深度缓存

生成画面时,同时生成帧缓冲和深度缓存,帧缓冲记录每个像素的颜色,深度缓存记录每个像素的最浅深度信息。

由于经过视图变换后,相机处于原点,看向-Z方向。可以将模型的Z坐标看做是深度,即距离相机的距离,距离越小越近。

左图为画面,右图为对应的深度缓存
for (each triangle T)
    for (each sample (x,y,z) in T)
        if (z < zbuffer[x,y]) // closest sample so far
            framebuffer[x,y] = rgb; // update color
            zbuffer[x,y] = z; // update depth
        else
            ; // do nothing, this sample is occluded


循之际,如星夜般的幻想。