GAMES101-06- Rasterization光栅化2 (Antialiasing and Z-Buffering)

Rasterization光栅化2 (Antialiasing and Z-Buffering)

Antialiasing反走样

Sampling theory

首先采样是广泛存在的,而采样产生的问题也是广泛存在的。

Sampling Artifacts采样瑕疵
Jaggies锯齿——sampling in space

image-20220308153946164

Moire Patterns——undersampling images

image-20220308153928966

右侧的图省略了奇数行与列。

Wagon wheel effect——sampling in time

image-20220308154339493

圆盘顺时针旋转,但为什么在人眼看的时候会发现有的部分在逆时针旋转?

答:这是因为人眼在时间上的采样跟不上圆盘运动的速度。

Antialiasing Idea:Blurring(Pre-Filtering)Before Sampling

image-20220308155011532

采样前先模糊处理的实际应用效果举例如下图:

模糊前——

image-20220308155152849

模糊后——

image-20220308155216197

上面的示例是先模糊后采样,那么考虑先采样后模糊行不行呢?

答:不行,举例如下:

image-20220308155425833

那么想要直到为什么反过来不行,就要学习一些频域的知识了。

Frequency Domain频域

首先回顾一下微积分的知识,微积分展开中有一种傅里叶级数展开,可以将一个函数用sin和cos的形式表示。

而傅里叶级数展开与傅里叶变换是紧密相连的,下图中就是傅里叶变换和逆傅里叶变换:

image-20220308160745009

从下图中的f(x)展开来理解傅里叶变换:

image-20220308161028954

可以知道傅里叶变换其实就是把函数分解成不同频率的段。

如下图左侧是f(x)中各项各自的函数图像,右侧是f(x)各项之和的函数图像:

image-20220308161204492

可以说,傅里叶变换可以把函数从时域变换到频域

对下图进行分析,来理解采样瑕疵产生的根本原因(采样速度跟不上信号变化):

image-20220308161557515

从上到下函数的频率逐渐增大,假设用完全相同的采样方法(每间隔图中竖虚线进行采样)对这些函数进行采样。观察f1(x)的采样情况,我们可以观察出原来函数大概的形状;同理观察f2(x)f3(x)的采样情况也是这样。但这种情况到f4(x)f5(x)的时候就不太妙了,对采样信号连起来会发现跟原来函数形状相差甚远。

这说明什么呢?

答:通过对上面采样频率和函数频率的一个分析可以知道,如果说函数本身频率很高,像f5(x),而采样频率很低,这就跟不上函数的变化,就没办法恢复原始信号。

走样的正式定义

答:如下图例子,同样的采样方法采样两种不同频率的函数得出来的结果我们无法区分,这就叫走样。

image-20220308162613732

Filtering滤波

滤波是什么意思呢?

答:就是把某些特定的频率给抹掉,看对应的信号发生的变化。(这时候傅里叶变换将时域变换为频域的作用就很重要了,具体变换如下图)

image-20220308163141382

右侧就是左侧图变换为频域的结果,怎么理解右侧图呢?

答:可以看到右侧图的中心,我们把中心定义为最低频的区域,然后周围定义为高频的区域。在不同区域上频域表示的信息,我们用亮度来表示。针对这张右侧图,那么可以看出大多数的信息都是集中在低频的区域,因为中间比较亮。当然高频信息也有,只是相对低频来说比较少。

为什么右侧图中有个非常明显的“十”字呢?

答:简单解释,就是我们在分析一个信号的时候,我们会认为这是一个周期性重复的信号。但是对于图来说很少有重复的,所以我们认为这张图到了右边界的时候又会重复这张图的左边的内容(可以看作是把这张图水平上叠放了好几张,竖直方向上也被叠放了好几张)。而正常情况下很少有图片的右边界和左边界完全一致,如果我们把这张图从左搬到右边(图像左边界跟图像右边界挨在一块),那么在这条边界上就会发生剧烈的信号变化,也就会产生一个极其高的高频。(我们一般都是分析图内部的事情,就忽略这两条“十”字的线)

High-pass filter高通滤波

此时我们做一个操作,将图的低频区域给抹掉(这种滤波,叫高通滤波),如下:

image-20220308164542277

那么这个时候想要看图片变成什么样,就做一次逆傅里叶变换得到图片如下:
image-20220308164629601

这样一来,就会知道对这张图而言高频就是图像内容的边界。进一步理解,边界可以认为就是图中内容左右两边发生巨变的地方,跟上方介绍“十”字出现的原因——左边界与有边界极大不同导致信号剧烈变化一样,图像内容的边界也会导致信号的剧烈变化,那这边界就是高频信息。

Low-pass filter低通滤波

这回如下图所示,我们只留下了低频信息,抹去了其他高频信息:

image-20220308165524285

同样做逆傅里叶变换操作,得到下图:
image-20220308165556013

可以看出这张图就忽略了很多细节,只能看到大概模糊的图像。从上方高通滤波对边界的分析可以知道,将高频信息抹去,意味着将边界信息抹去,从这个角度上看,低通滤波处理的图像结果确实是没有了边界信息。

Band-pass filter带通滤波

如下图,我们将高低频区域都抹去,只保留一部分不低不高的部分:
image-20220308170042153

此时做逆傅里叶变换得到下图:

image-20220308170123311

可以看到图中可以稍微看出边界和中间一部分色块。

将不低不高区域放大:

image-20220308170244388

得到逆傅里叶变换结果如下,因为高频区域变多一些,所以边界就又清晰了一点:

image-20220308170309534

Filtering=Convolution卷积(=Averageing平均)
卷积概念

这一部分,跟上一部分的Filtering从不同的方向理解。

怎么理解平均?

答:比如将高频信息抹去,图像边界模糊,就好像整个图像模糊了,而模糊可以看作是一种平均操作。

怎么理解卷积?

答:卷积实际上就是定义一个滤波器(滤波器也被称之为卷积核),这个滤波器可以是一维数组也可以是二维数组,使用这个滤波器对原来的信号挨个进行处理,然后把处理好的结果写进一个与原数据相同大小的容器中。

滤波的本质是将信号与滤波器在时域上进行卷积的操作。观察下图

image-20220309210101518

首先信号是一维信号,而滤波器可以看作是窗口,可以左右滑动,窗口大小为3格,每格对应一个数。

而这就是为了进行卷积操作。

卷积操作

怎么进行卷积操作?

答:在移动窗口的过程中,滤波器窗口上的那三个数对应信号的三个数做一个点乘,将得出来的结果写回窗口中心值对应的信号位置。这样就是卷积操作的过程,比如当前就是结果就是1×(1/4)+3×(1/2)+5×(1/4)=3

image-20220309211238211

当然,数学上卷积的定义不是这样的,以上是图形学里简化的卷积描述。

进一步举例理解卷积定律:

image-20220310195410733

上图中上半部分表示,一张图片进行使用3*3的一个卷积核进行卷积操作,得到的结果一张模糊的图片,
同时如果对原始图片进行傅里叶变换,把图片从时域转换到频域,卷积核也经过傅里叶变换从时域转换到频域,这时把转换到频域的图片与转换到频域的卷积核相乘,使用相乘的结果进行逆傅里叶变换得到的结果与在时域上进行卷积操作的结果一样,这其实就是卷积定律的一部分内容:时域上的卷积相当于频域上的乘积。

滤波器(卷积核)

为什么卷积核要乘以1/9呢?

答:卷积核(滤波器)在使用的时候乘以1/9,它是一个3*3的二维数组,之所以乘以1/9 是为了图像中整体的颜色值与原本的颜色不发生变化,在做卷积操作时会取原图像中的9个像素与卷积核中的元素分别相乘再相加,如果不乘以1/9,得到的结果是原来的9倍,会导致图像异常明亮,乘以1/9其实是对处理结果进行了一个归一化的操作

卷积核经过傅里叶变换后,可以发现它大都是低频信号,所以卷积核可以认为是一个低通滤波器。

image-20220310210908430

image-20220310211046992

通过上面的图片发现,卷积核在时域上变大,它在频域上反而变小了,也就是使用越大的卷积核经过卷积处理得到的图像会越模糊。

怎么理解呢?

答:可以理解,当卷积核变大,比如用21x21的卷积核进行处理,最后得到的只能是更加模糊的图像。

Sampling=Repeating

image-20220310221255195

使用a函数与c函数相乘,乘出来的结构就是e函数,其实就是采样的信号
卷积定律中的另一部分内容是:时域上的乘积相当于频域上的卷积
依据上面的定律可以得到 a乘以c = e 等价于 b卷积d = f

通过上面的几幅图片可以发现,取样结果在频域上的体现就是把原本频域的信号进行重复,也可以认为采样就是在重复原始信号的频谱。

Antialiasing

走样的本质

我们已经知道采样是根据冲击函数的间隔(频率)在重复信号的频谱,如下图中下半部分,当冲击函数的间隔(取样频率)小于频谱的大小时,就会出现部分频谱混叠的现象,这就是发生走样现象的本质。

image-20220310221609533

反走样的方法

通常采用的反走样的方法是,先对图形进行模糊处理然后在进行采样,之所以这样可以达到反走样的目的。

image-20220310221729595

它实际的原理如下

image-20220310221750977

如上图,先对原始信号做模糊处理,即使用低通滤波进行过滤,就可以拿掉频谱上的高频信号,然后在使用原本的采样(冲击)函数进行采样,会发现原本混叠的部分在采样前被过滤掉了,这样信号最大限度的保持了原有的样子,又保证不会发生混叠,进而达到反走样的目的。

接下来列举几个重要的反走样的方法:

多重采样 MSAA

多重采样 MSAA( Multi Sampling Anti-Aliasing)取更多的点来实现反走样,把一个像素继续划分成很多个小的像素,同样每个小的像素也有各自的中心点,如下图中把一个像素分成四点小的像素,然后对每个小的像素判断是否在三角形上,然后根据小像素的在三角形中的个数得到这个像素在三角形中的覆盖率,通过覆盖率可以算出这个像素对应的颜色,MSAA实际上解决的是对图形进行模糊操作的这个过程,他只是通过近似的一种方法进行模糊,只是增加了采样点并没有提高屏幕分辨率。

image-20220310221849317

image-20220310221910269

快速近似抗锯齿 FXAA

快速近似抗锯齿 FXAA(Fast Approximate Anti-Aliasing),是一种和采样无关,在图像层面做的处理。处理过程是对已经采样的图片处理,找到三角形的边界,把有锯齿的边界替换为没有锯齿的边界,而且处理起来非常快。

时间抗锯齿 TAA

时间抗锯齿 TAA(Temporal Anti-Aliasing),最大的特点就是非常快速,是将静态的图片在时间上进行采样,用相邻两帧同一个像素上不同位置的点来感知是否在三角形内,计算的时候要考虑上一帧感知的结果要被应用进来,相当于是MSAA对应的样本分布在时间上,并且当前这帧没有任何额外的操作。

深度学习超级采样 DLSS

深度学习超级采样 DLSS (Deep Learning Super Sampling),它依赖深度学习,使用低分辨率图像(比如1080p)生成高分辨率图像(8K),再把8K图像缩回4K,得到抗锯齿图像,以代替传统的时间抗锯齿等技术。

posted @   L-Yeeky  阅读(56)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示