GAMES101-06:光栅化2:反走样&深度缓冲
六、光栅化2:反走样&深度缓冲
Antialiasing and Z-Buffering
Artifacts:瑕疵,指一切看上去不太对的地方
采样可能产生的瑕疵:
锯齿
摩尔纹:将左图的奇数行和奇数列删除,会产生右面的效果
车轮效应:车轮高速逆时针旋转时,看上去好像是在顺时针旋转
现象 | 原因 |
---|---|
锯齿 Jaggies | 在空间上的采样率不足 |
摩尔纹 Moire | 对一个图像降低采样率 |
车轮效应 Wagon wheel effect | 在时间上的采样率不足 |
6.1 反走样方法:在采样之前进行过滤/模糊处理
6.1.1 先滤波,后采样:Aliasing
原始图片 | 点采样 | 模糊处理抗锯齿 |
---|---|---|
6.1.2 先采样,后滤波:Blurred Aliasing
6.2 频率域
6.2.1 空间域 与 频率域的转换:傅里叶变换
- 任何一个函数,均可以展开为多个三角函数的和
- 傅里叶变换,实际上就是将函数在不同频率域上展开
6.2.2 函数的频率越高,需要的采样频率越高
6.2.3 从频率角度理解走样
- 在采样频率一定时,采样两个频率不同的函数,我们无法区分这两个函数,因此会产生锯齿
6.3 滤波:删除一些频率的内容
6.3.1 通过傅里叶变换,将图像变为频率图
- 中心是低频区,四周是高频区
- 亮度表示当前频率包含的信息数量
- 上图的信息主要集中在低频区
- 出现两条线的原因
- 一般情况下,傅里叶变换会将图像视为周期函数
- 对于图片来说,相当于在图像的右边再复制一份图像
- 通常情况下,图片的左右边界不会相同,因此在边界处会有剧烈的变换
- 分析图像内部的内容时,一般忽略这两条线
6.3.2 高通滤波
高通滤波 ==> 只保留图像的高频部分 ==> 图像内容的边界
6.3.3 低通滤波
低通滤波 ==> 只保留图像的低频部分 ==> 对图像的模糊处理
6.3.4 过滤高频和低频部分
6.4 滤波 = 平均 = 卷积
Filter = Averaging = Convolution
- 滤波器覆盖信号的某些部分时,将对应位做点乘:卷积操作
- 实际上也是一个平均操作
6.4.1 卷积定理:时域的卷积 <=> 频域的乘积
卷积定理:在时域上的卷积,等价于在频域上的乘积,即以下两个操作等价
- 在时域上,通过卷积进行滤波
- 先通过傅里叶变换,将函数与滤波器转换到频域上;然后把两者相乘;最后再进行逆傅里叶变换,变换到时域上
6.4.2 滤波器的时域与频域的关系
时域上变大了,频域上反而变低了:Box越大,得出的结果越模糊
6.5 频率角度理解采样
6.5.1 采样 = 重复原始信号的频谱
采样频率越快,频谱复制越稀疏
采样频率越满,频谱复制越密集
时域上采样 <=> 两个函数相乘 | 频域上的卷积 <=> 重复原始信号的频谱 |
---|---|
6.5.2 走样 = 频谱的内容出现重叠
6.5.3 反走样 = 先删除高频信息,在采样
- 先模糊,后采样:先删除一个信号的高频信息,然后在进行采样
6.6 反走样的实际做法
- 对每个像素,根据三角形覆盖的面积,做平均值
- 然后再进行采样
6.6.1 MSAA:Multisample Antialiasing
- 超采样 SuperSampling:将每个像素划分为多个小的采样点,然后该像素的颜色为多个采样点的平均
- MSAA近似的是抗锯齿的第一步操作,即模糊处理
- MSAA无法提高屏幕的分辨率,只是通过多个采样点得到近似的三角形覆盖
- MSAA是通过增大计算量,得到抗锯齿效果
- 在实际使用中,会将采样点按特殊的方法排列,有些采样点还会被多个像素复用
6.6.2 FXAA:Fast Approximate Antialiasing
- 快速近似抗锯齿
- 通过图像的后期处理,先将有锯齿的图像得出来,然后通过图像匹配找到边界,将这些像素换为边界上的颜色
6.6.3 TAA:Temporal Antialiasing
- 通过找上一帧的信息,进行抗锯齿操作
- 假设是静止画面,在相邻两帧同一个像素用不同的点感知是否在一个三角形内
- 复用上一帧感知到的值,相当于将MSAA的采样点分布在时间上,对于具体的某一帧没有额外操作
6.7 超分辨率/超采样
- 采样率不够,而分辨率较大时,会使用这种技术
- DLSS:Deep Learning Super Sampling,通过深度学习,猜测丢失的信息
6.8 深度缓冲:解决可见性
- Z-Buffer:存储每一个像素,所看到的几何物体的最浅距离
- 设Z始终为整数,且Z越小离相机越近
- 具体算法:
- 初始化深度缓存为
∞
- 对于每一个三角形
T
- 对于
T
中的每一个采样点(x,y,z)
: - 如果
Z < z-buffer[x,y]
:更新frame-buffer、z-buffer
- 否则,跳过该采样点
- 对于
- 初始化深度缓存为
- 复杂度
- 有
n
个三角形,则复杂度为O(n)
- 此处并没有排序,而是对每一个像素,维护了一个最小值
- 有
- 画出来的结果,与画三角形的顺序无关
- 深度缓存无法处理透明物体
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 华风夏韵!
评论