[GAMES101]现代计算机图形学课程总结2:光栅化和反走样
屏幕空间
GAMES101的屏幕空间约定

- 原点在屏幕矩形的左下角
- 像素坐标使用 ( x , y ) (x,y) (x,y)的形式,x和y都是整数
- 像素坐标的范围从 ( 0 , 0 ) (0,0) (0,0)到 ( w i d t h − 1 , h e i g h t − 1 ) (width-1, height-1) (width−1,height−1)
- 像素坐标 ( x , y ) (x,y) (x,y)对应的像素的位置为 ( x + 0.5 , y + 0.5 ) (x+0.5,y+0.5) (x+0.5,y+0.5),即像素位于坐标格的中心
- 屏幕覆盖的范围是 ( 0 , 0 ) (0,0) (0,0)到 ( w i d t h , h e i g h t ) (width, height) (width,height)
标准立方体到屏幕的变换
- 忽略z坐标
- 将xy平面中的
[
−
1
,
1
]
2
[-1,1]^2
[−1,1]2变换到
[
0
,
w
i
d
t
h
]
∗
[
0
,
h
e
i
g
h
t
]
[0,width]*[0,height]
[0,width]∗[0,height]
其实就是简单的缩放加平移,是一个仿射变换:

光栅化
光栅显示器
示波器,CRT显示器,LCD, LED,墨水屏等等
光栅化Rasterization定义
光栅化就是绘制到光栅显示器上
三角形-基础的形状图元,使用三角形的优点
- 最基础的多边形
- 保证共面
- 很好判断点是否在其内部(叉积)
- 三角形顶点之间插值方法很好做(重心坐标插值)
采样(Sampling)
采样一个函数就是求某个点的函数值
通过采样可以离散化(discretize)一个函数
采样是图形学的核心概念
- 可以采样时间(1D)
- 采样面积(2D)
- 采样方向(2D)
- 采样体积(3D)
光栅化是采样2D位置
Sample If Each Pixel Center Is Inside Triangle
光栅化是在2D屏幕内使用像素坐标对一个函数进行采样,这个函数就是像素中心是否在三角形内部:inside函数



检查屏幕中所有像素太浪费!使用包围盒优化

真实显示设备中的光栅化

走样和反走样


图形学中的采样Artifacts
- Jaggies(锯齿):空间采样的Artifacts
- 摩尔纹:降采样图片的Artifacts
- Wagon wheel effect(车轮效应): 时间采样的Artifacts
走样(Aliasing)的背后原因
- 信号变化太快(频率高),但是采样的太慢
反走样(Antialiasing)的方法
采样之前先进行模糊(先过滤)
Blurring(Pre-Filtering) Before Sampling
背后的原理
傅里叶变换
使用一组sin或cos函数的加权和来表示一个函数

傅里叶变换将一个信号分解成一系列频率

上图中,函数经过傅里叶变换从时域变换到频域。
走样产生的原因
更高的频率需要更快的采样

降低采样频率造成走样

上图中,蓝色的高频信号,但是由于采样频率过低,采样点看上去是黑色的低频信号所产生。
走样的定义
Two frequencies that are indistinguishable at a given sampling rate are called “aliases”.
两个不同的频率在一个给定的采样率下无法区分,称为“走样”。
何谓滤波

滤波就是将特定的频率删掉
频域图:图片的频率的可视化
通过傅里叶变换将图形从时域变换到频域

频域图中,中心为最低频区域,四周为高频区域。不同频率上有多少信息通过亮度来表示。图中的十字线是因为做频域分析时,信号是周期性的,而图形并不是周期性的,所以将图像在水平和竖直方向上平铺,由于大多数图片左边和右边,上边和下边是不连续的(四方向连续的图除外),因此平铺时会在交界处产生剧烈的信号变化,从而会产生极其高的高频。
高通滤波:只去除低频部分(从而得到图像内容的边界-变化大的部分)

低通滤波:去除高频部分(模糊)

滤波=卷积(=求平均)

卷积定理
时域上对两个信号进行卷积对应了频域上两个信号的乘积,反之亦然
因此进行卷积有两个方法:
1)直接在时域上进行卷积过滤
2)通过傅里叶变换将信号从时域变换到频域;在频域上将信号和傅里叶变换之后的卷积核相乘;再将信号通过逆傅里叶变换转换回时域

卷积核越大,过滤的频率越低(比如21x21的卷积核就别3x3的卷积核对应的低通滤波器更低频,从结果上说更模糊)
采样和频率
采样=重复频率或者说重复频域上的内容

上图中,左边是时域。(a)为时域上的原始信号,©是一个采样函数,这个函数只在特定的位置有值(称为冲击函数),在时域上使用©乘(a)得到采样后的离散的点(e)。右边是频域,(b)为(a)经过傅里叶变换得到的频谱,(d)是冲击函数经过傅里叶变换,得到的还是一个冲击函数,但间隔不一样。由于时域上的乘积就是频域上的卷积,因此使用(d)卷积(b),最后得到(f)为采样后的信号的频谱。从图中可以看出,采样就相当于将原始信号的频谱复制了很多份。
走样=不同的频谱发生了混叠

由于不同的采样频率会使得频域上采样函数(冲击函数)的间隔不一样,当间隔小时(对应了采样频率低),复制的频谱就会发生混叠,混叠处就产生了走样。
反走样
如何减少走样错误
- 方法一:提高采样率
本质上是增加傅里叶域中复制的频谱的间隔。
需要更高分辨率的显示器,传感器和frame buffers。
代价高。 - 方法二:反走样(Antialiasing)
先把信号的高频信号去除,再做采样。(即先做低通滤波,即先做模糊)
即在傅里叶域上复制之前先将频谱变窄,这样复制后就可以避免混叠。


如何做模糊
使用低通滤波器(卷积核)对图像进行卷积就可以让图像模糊。对于反走样,我们使用1个像素大小的低通滤波器:

自己的理解:为什么是一个像素的低通滤波?如果是较大的滤波器会过滤到更大范围的频率的信号。而我们希望过滤掉最高频的信号(也就是图像边缘),图像边缘信号频率变化最大,造成走样,所以要过滤掉。而大的卷积核一般是特意要做图像模糊使用的,比如高斯模糊效果。对于反走样,1像素的正好。
但是只有一个像素,如何求平均值?
通常的卷积操作要计算卷积核范围内多个像素的平均值。但是我们做反走样只有一个像素,怎么求平均呢?和谁平均呢?这里其实是要看这一个像素内部有多少面积被三角形覆盖。要将像素内部分解成很多的子像素,比如2x2共4个,然后对这些子像素是否在三角形内进行inside函数计算的结果取平均值。但是要注意,采样仍然只采样像素中心位置。因此光栅化三角形时的inside函数不再仅仅返回0或1了,而是会返回这个像素被三角形覆盖的面积(像素边长为1)。

MSAA


以上说的都是MSAA方法,MSAA并没有增加采样率,它只是使用子像素来计算像素被三角形覆盖的百分比,一个像素仍然只采样一次,采样位置为像素中心。在工程上来说,MSAA对于一个像素只计算一次颜色(pixel shader),然后根据三角形覆盖百分比来算最终的颜色。而SSAA(超级采样)就是用更多的子像素进行采样,然后计算平均值。
其他的AA方法
- FXAA (Fast Approximate AA): 快速近似反走样,是通过后期处理的方法,针对已经产生了走样(锯齿)的光栅化结果,将边缘(锯齿)部分提取出来并替换为没有走样的边缘。速度很快。该方法和采样无关,是在图像层面上抗锯齿。
- TAA (Temporal AA): 时间反走样。对于静止的图像,每一帧使用不同的子像素位置来感知像素是否在三角形内,然后将当前帧和前一帧的感知结果进行平均。相当于把MSAA的样本分布在时间上。
超分辨率(Super resolution)
- 将低分辨率的图拉大到高分辨率,会有锯齿。
- 和AA类似,都是要解决样本不足的问题。
- DLSS(Deep Learing Super Sampling)
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)