Games101-Rasterization(Antialiasing and Z-Buffer)笔记
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 | /*初始 z 值为比任意点要深的值*/ |
复杂度
O(n)
zbuffer无法处理透明物体