一、前情提要
- 在观察和投影变换的基础上提出了视口变换,最终我们会将【-1,1】^ 3 立方体转换到屏幕空间中去。
- 当所有图像都在屏幕空间中时,我们就要将所有的图像画在屏幕上,这个过程就是光栅化,光栅化就是简单的在屏幕空间的采样。最重要的思想:我们要用像素的中心,对三角形可见函数进行采样。
二、走样与反走样
(1)问题的提出
绘制下图中的三角形。
检查像素是否在三角形内(进行采样):
根据采样结果进行成像:
对比原三角形,成像结果与预期差距很大,并且生成的三角形是有锯齿的。
(2)走样的例子
-
下图是采样中产生的一种走样
-
下图是采样中产生的另一种走样:摩尔纹。如下图所示,对坐边原图去掉奇数行和奇数列,再展示同样大小的图像就得到了右边的图像。
-
动画和视频是对图像在时间上的采样,下图为在时间中采样产生的走样。
-
走样的本质:信号(函数)变换速度太快,导致采样的速度跟不上变换的速度。
(3)反走样的核心思想
反走样第一步:对原始的图像或信号做一个模糊或滤波
直接采样的走样情况:
模糊(反走样)后采样的情况:
Blurred Aliasing走样后模糊,会导致情况更加糟糕。
三、反走样的本质
(1)从频率上分析走样
-
频域(Frequency Domain)和频率(Frequency)
-
通过傅里叶变换,我们可以知道:任何周期函数,都可以看作是不同振幅,不同相位正弦波的叠加。因此我们可以将函数变成不同频率的段,并且我们把不同频率的段显示出来。
-
下图中有五段不同频率的函数,越往下函数的频率越高。
-
我们采取同样的频率对以上五个函数采样结果如下:
-
可以看到到f5时采样效果非常差,这告诉我们采样频率要根据函数本身的频率来决定,如果函数本身频率很高而采样频率很低就会发生走样,无法恢复出原始的信号。
(2)定义走样
- 走样的定义:对两种频率不同的信号进行采样,根据得到的结果我们无法区分它们。
- 下图中我们可以看到两条曲线,它们分别对应两条原始信号,如果我们使用图中圆圈的点去采样这两条原始信号,会得到相同的采样结果,这就是走样。
(3)Filtering滤波
-
滤波:删除原始信号中频率位于一定区间的波。
-
通过傅里叶变换得到信号的频域图(频谱)
-
删除频域图中低频的信号,即进行高通滤波(高频通过),然后再进行逆傅里叶变换将频域图还原回原始的信号,如下图左边所示。下图右边频域图中心变黑就是抹除了低频信号,留下的高频信号属于图像的轮廓(因为轮廓出信息变换的很快)。
-
低通滤波,如下频域图所示,过滤掉所有的高频信号后,再逆傅里叶变换得到的图像如左图所示,保留了内容但是少掉了轮廓:
-
提取频率位于固定区间(不高但也不低)的信息:
(4)滤波-平均-卷积
做一个卷积操作:
可以直接对图像进行卷积操作。也可以先把图像通过傅里叶变换转到频域上,然后把卷积也转到频域上,再相乘再逆傅里叶变换。时域的卷积等于频域的乘积。
(5)分析采样的本质
原始信号为a,采样的一些列冲击函数为c,得到的采样结果为e。又因为时域上的乘积等于频域上的卷积,采样就是在重复一个原始信号的频谱,如下图中右边所示采样就是重复复制原始信号的频谱。
正常采样与走样如下图所示,如下图圈中所示,走样就是在重复复制原始信号的频谱时导致了重叠。
分辨率的提高有利于降低走样的发生。
(6)定义反走样
经过上面的阐述,我们先对原始信号进行低通滤波,这样我们再进行采样,就不容易发生走样。即先进行模糊,再进行采样,这就是反走样。
在实际操作中,我们应该如何模糊一个三角形?我们用一定大小的滤波器对图像进行卷积,达到模糊操作。
(7)MSAA反走样技术
现在回到三角形,之前我们对于每个像素的采样函数仅判断它是否被覆盖,覆盖了就涂颜色,没覆盖就不涂,而现在我们为了反走样要进行模糊。
我们根据像素方格被三角形覆盖的面积去决定它的颜色,这样它就不至于要么是涂满颜色的,要么是没有颜色的,这样我们的采样函数就也能涉及一些"像素中心点未覆盖,但像素方格被覆盖"的像素点,以达到模糊三角形边缘区域的目的。
如果一个像素点被完全覆盖,那么我们就给它100%三角形对应区域的颜色,如果只被覆盖了一般,那就给它50%三角形对应区域的颜色。如下图所示:
那么我们如何得到每一个像素方格被三角形覆盖的面积呢?MSAA近似反走样。如下图所示,我们在像素方格中内置更多采样点,通过计算内部采样点的覆盖率去近似计算出 像素方格被三角形覆盖面积的占比。
使用MSAA反走样(模糊)的示意图如下:
模糊操作完成后得到的信息:
MSAA其实隐含了采样,因为上图我们已经可以得到颜色占比,采样是再乘以三角形颜色值即可。
(8)MSAA反走样的代价
MSAA的代价:增大了计算量,如果使用4×4的采样点,则增大了16倍的计算量。在工业上会用不同的图案去分布采样点,并且一个采样点会被其他像素复用。
(9)其他的抗锯齿方案
FXAA,原理:后期处理。得到有锯齿的图,找到有锯齿的边界,换成没有锯齿的边界。
TAA,复用上一帧的颜色值,即把MSAA计算的的颜色分布在了时间商。
超分辨率:把低分辨率图像转换成高分辨率图像,例如把512×512变成1024×102,要解决的也是采样率不足。但是这些未知的值要去猜,一般使用AI深度学习。