InkSoul/content/computergraphic/走样与反走样.md

165 lines
7.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

---
title: "走样与反走样"
date: 2022-05-12T22:08:22+08:00
---
### 走样
#### 从像素角度
屏幕是由一个个像素组成,在光栅化时,只有中心被三角形覆盖的像素会被着色,而且被覆盖的像素点的分布往往是离散的,自然而然地形成如下图斜线形成的阶梯状的锯齿
![](../../images/aliasing_pixel.png)
---------------
#### 从信号角度
##### 采样和滤波理论(Sampling and Filtering Theory)
###### 采样(sample)
采样就是将连续信号转换成离散信号(采样信号),经过滤波后会被恢复成重建信号
![](../../images/sample_and_reconstruct.png)
如果采样的频率过低,则会发生走样或混叠(aliasing),如图中,蓝色的为原信号,红色为采样点,绿色虚线为重建后的信号
过低的采样频率会使重建的信号成为低频信号
![](../../images/figure.5.17.png)
若采样频率恰好是原信号的两倍,重建信号则表现为一条直线
![](../../images/figure5.17.1.png)
采样理论(sampling theorem):采样频率必须为原信号频率的两倍以上,才能完整地重建原始信号,存在一个最大频率,因而采样频率有频带限制
<br>奎斯特率(Nyquist rate): 频率为原信号频率两倍的采样频率<br>
###### 重建(reconstruction)
重建时需要采样信号进行滤波,通常使用下图中的三种滤波器(box filter,tent filter,sinc filter)且滤波器的面积必须为1以确保恢复的信号不会被放大或缩小
![](../../images/three_filter.png)
box filter 对信号进行滤波并重建信号的过程如下图
<br>直接将采样点位置替换为box filter波形的方式会因 box filter 本身的不连续使重建信号产生不平滑的现象<br>
但仍然因其易于实现的特性被用于重建
![](../../images/box_filter_construct.png)
-----------
tent filter 在滤波时会对每个相邻的采样点之间使用线性插值一次重建的信号更加平滑但采样点位置会发生斜率突变所以tent filter 并不完美
![](../../images/tent_filter_constructed.png)
-------------
出于让重建信号保持平滑的目的,我们必须使用一个理想低通滤波器
基于傅立叶变换理论的解释理想低通滤波器在频域中的表现类似于box filter,在频域中相乘时会过滤掉所有超过这个滤波器宽度的频率在频域的box fliter 转换到空域的时候会是一个sinc filter ,在频域相乘也等价于在空域中进行卷积,卷积即为滤波
![](../../images/convolution_theorem.png)
例如sinc filter就能够实现过滤高频信号保留低频信号的理想低通滤波器效果
![](../../images/sinc_filter_process.png)
对于sinc filter 在假设采样频率为$f_s$,采样点间隔为$\frac{1}{f_S}$的情况下,它会过滤掉超过$\frac{f_S}{2}$的所有高频信息因此sinc filter 在采样频率为1.0会是一个理想低通滤波器,此时采样信号的最大频率应当小于$\frac{1}{2}$,但是由于sinc filter 有无限的滤波范围,所以它会在某些范围内出现负值
尽管负值的出现不常见但在实践时我们更倾向于使用无负值的lobes(常见的有高斯滤波器(Gaussian filter)),并且使用重采样(resample)的方式对重建信号进行放大或者缩小
注:如果对于卷积为主的各类滤波感到不解可见[【官方双语】那么……什么是卷积?](https://www.bilibili.com/video/BV1Vd4y1e7pj/)
---------------------------
#### 重采样
设采样信号灯的采样间隔为整数列间隔为1则我们可以通过重采样来将采样点间隔变为a当$a>1$时会缩小信号(downsampling)$a<1$时会放大信号(upsampling)
如图,对重建信号使用双倍采样率进行重采样便实现了信号放大
![](../../images/resample_upsample.png)
这种方法不适用于信号缩小,易使信号过于高频
对于信号缩小的情况,我们需要先对1间隔采样信号使用$sinc(\frac{x}{2})$ filter 滤波产生一个连续信号,再重采样2间隔,由于频谱范围更大的低通滤波器才能过滤更多的高频信号,类似于对图像进行第一次模糊再重采样产生一个低分辨率图像
![](../../images/resample_downsampling.png)
由下图可见,滤波可以对三角形的边缘产生模糊,进而产生一定的反走样效果
![](../../images/sample_resulst.png)
![](../../images/pre-filter_sample.png)
### 反走样
#### 现代反走样技术
##### Screen-Based Antialiasing
对于我们之前提到的采样,我们只对像素正方形的中心进行是否在三角形内部的判断,这意味着对于边缘的像素正方形,无论覆盖面积有多大,只要不包含中心点都会被判定在三角形外,从而不被渲染,当采样率提升,如下图的4spp(sample per pixel)以某种方式混合计算获得更好的像素效果
![](../../images/Screen-Based.png)
Screen-Based Antialiasing 通常在屏幕空间区域使用采样图案来采样从而对颜色进行如下的加权计算
对整个像素内颜色的平均计算遵循:
$$p(x,y)=\sum_{i=1}^nw_ic(i,x,y)$$
$n:$每个像素内采样点的数量
$c(i,x,y):$ 计算采样位置在屏幕坐标系上的坐标$(x,y)$并填充颜色,也可以视为两个方程,$f(i,n)$定位屏幕上需要采样的位置$(x_f,y_f)$,第二个方程计算填充的颜色
$w_i:$每个采样点所占的权重,通常为uniform形式,由外界输入
###### Supersamping Antialiasing (SSAA) 超采样抗锯齿
在每一个像素里计算多个采样的算法往往被称为超采样(supersample)或过采样(oversample)
SSAA又被称为全屏幕抗锯齿(full-screen antialiasing,FSAA),也叫超采样抗锯齿(supersampling antialiasing,SSAA)
主要在于渲染比目标分辨率大的图像后,过滤邻近的像素点来采样至目标分辨率
例如:
当目标图像分辨率为1280$\times$1024时,渲染2560$\times$2048的图像后进行2$\times$2像素的采样,得到目标图像
劣势:
性能开销大,每次都需要对子样本进行完整的包含深度测试的采样,当然也可以减少采样点($2\times11\times2$)来减少部分开销
与超采样相关的累计缓存(accumulation buffer)也可以起到减少开销的作用,主要在于使用一个与生成图像分辨率相同的buffer,但每个通道中有更多的颜色bit
例如在采样的像素为$2\times2$的情况下,会生成4张图像且每张图都会在XY轴上偏移半个像素的距离使得输出像素的采样点正好对应图像的像素点中心
优势:
实现方式简单,只需要一个高分辨率图像和box filter就可以实现
下图是采样点在像素点内位置类型
![](../../images/sample_point_position.png)
案例:NAVIDIA's DSR(dynamic super resolution)
渲染4k的图像利用13个采样点的高斯滤波采样回1080p提升画面细节
------------
###### MSAA(Multisampling antialiasing)
MSAA同样在一个像素中设置多个采样点,在光栅化时计算三角形在像素内对采样点的覆盖率,之后只计算每个片元的像素着色器,采样中心点的位置计算颜色信息再乘上覆盖率,最后输出这个像素的颜色
颜色计算与深度判断
![](../../images/MSAA.png)
总体流程如下
![](../../images/MSAA_sample.png)
![](../../images/MSAA_color.png)
SSAA不同的是,MSAA只对每个像素计算一次采样,而非对整个图像进行渲染,但计算量依旧倍增
------------
###### CSAA(coverage sampling antialiasing) and EQAA(enhanced quality antialiasing)
两者前后分别在2006年由NVIDIAAMD先后提出
两种技术都通过提前存储片元的平均效果来提高采样率
例如,EQAA2f4x模式下,会对每四个采样点计算并通过表的形式存储颜色和深度值(如下图),这使得四个采样点只需1bit空间就可以确认像素位置的着色颜色值
![](../../images/EQAA_color_table.png)