Games101-Rasterization(Antialiasing and Z-Buffer)

课堂收获的知识过多,无法全部记录在笔记中…只简单的记录一下大概

走样和反走样

what

上节课通过判断每个 pixel 是否在三角形内得到的图形会出现很严重的锯齿状边缘,这就是一种走样(Aliasing)

走样(Aliasing)只有锯齿状一种吗?

  • 空间方面:摩尔纹,锯齿
  • 时间方面:车轮效应

简单来说,产生走样的原因是:信号变化太快(数据量太大),采样跟不上(采集的数据少)

黑话:Artifact,指采样产生的各种误差和错误

why

涉及信号处理和图像处理

首先提出一种可行方案:先将原图模糊再采样。效果确实比原先好,相当于在外围做了一圈渐变

两个步骤能调换次序吗?


基础知识引入

傅里叶级数展开:任何周期函数,都可以表示成一系列 正弦+余弦+常数 的形式

傅里叶变换:时域$\rightarrow$频域,用于采样

逆傅里叶变换:频域$\rightarrow$时域,用于还原


滤波:将特定频率过滤掉

分析一张黑白照片

(频率信息分布图?忘了)中心白色(低频信号),周围黑色(高频信号),有白色十字线(上下左右默认n张图片连续重叠,变化趋缓)

用高通滤波(High-pass filter)和低通滤波(Low-pass filter)处理图像后,发现高频表示边缘(怎么定义边缘?),低频表示变化平缓的区域

对于彩色图像则是在 RGB 三个通道上判断


如何滤波

Filter = Convolution(卷积,直观理解为平均化和模糊处理)

将某位置信号和周围信号通过一个滤波窗口加权平均

时域乘积 = 频域卷积(还没搞懂)

box fliter:a n*n low-pass fliter

box越大越模糊,参与平均的位置越多


采样

整个过程是:频谱 $\rightarrow$ 采样 $\rightarrow$ 重复原始信号频谱

使用冲击函数取样

如果冲击函数的频率不够,则时间间隔变小,采样复原出的函数每个周期就会出现交叉,产生混叠,从而出现走样

how

反走样

模糊(low-pass)在做什么? 将函数的交叉部分去掉,得到没有交叉的函数

然后再采样


更准确的灰度值(色彩值)

MSAA(MultiSampling Anti-Aliasing,多重采样抗锯齿) :当前分辨率成倍提高,然后再把画缩放到当前的显示器上。只是寻找出物体边缘部分的像素,忽略掉了不会产生锯齿的内部像素

SSAA(SuperSampling Anti-Aliasing,超级采样抗锯齿):在 1pixel 范围内加入假象的 n*n 个均匀分布定位点,提高覆盖率的准确度,但是计算量是原先的 n2

但实际使用时用了各种优化手段,例如不均匀分布等减少来计算量,所以帧数不会下降太剧烈

目前 Antialiasing 方法

工业上:

  • FXAA(Fast Approximate Anti-Aliasing,快速近似抗锯齿):图像层面,先得到有锯齿图像,再在图像上直接处理
  • TAA(Temporal Anti-Aliasing,时间性抗锯齿):运用上一几帧的信息,最常用的图像增强算法之一。
  • TXAA(Temporal Multi-Sample Anti-Aliasing):TAA+MSAA
  • DLSS(Deep Learning Super Sampling):基于深度学习的超采样

可见性

三角形之间会有遮挡关系

painter‘s Algorithm:对图像从后往前排序

但存在图形互相交叠的情况


z-Buffer(深度缓存)

对每一个像素排序,记录每一个像素最浅的深度信息

生成结果最终图像(frame buffer)的同时生成深度图(depth buffer,z-buffer)

处理流程:记录每个 pixel 的深度,遇到更浅的深度时,画上去同时更新深度图

1
2
3
4
5
6
7
/*初始 z 值为比任意点要深的值*/
for(each triangle T)
for(each sample(x,y,z) in T)
if(z < zbuffer[x,y])
framebuffer[x,y] = rgb; //更新帧缓存
zbuffer[x,y] = z; //更新深度图


复杂度

O(n)


zbuffer无法处理透明物体