跳过正文
  1. Posts/

GAMES101_06: 光栅化(深度测试与抗锯齿)

··4333 字·9 分钟·
Xenolies
作者
Xenolies
Keep On Keeping On

采样 Sampling
#

  • 光栅化 = 采样二维平面上的点
  • 摄影 = 采样感光元件上的信息(将光学信息离散为图像上的像素)
  • 视频 = 在时间时间中的采样
    摄影
视频

采样带来的失真
#

  1. 锯齿 由于采样率对于信号来说不够高,造成了信号的走样问题,形成了锯齿

  2. 摩尔纹 左图跳过奇数行和奇数列后得到右图

  3. 车轮效应 对高速旋转的物体采样可能出现视觉上倒转的现象

失真的原因
#

信号频率太快,采样太慢。

反走样 Antialiasing
#

  1. 流程总览

原始连续几何信号 → 预滤波(Pre-Filter) → 采样(Sample) → 抗锯齿结果

反采样的顺序: 先滤波,再采样

  1. 分步拆解
步骤操作原理效果
原始三角形(左)连续的几何信号,边缘锐利突变包含大量高频成分,直接采样会产生严重走样(锯齿)边缘锐利,无过渡
预滤波(中)低通滤波(高斯模糊 / 盒式滤波)去除高于奈奎斯特频率的高频成分,从根源避免频谱混叠边缘柔化,出现红→白的平滑渐变
采样(右)对滤波后信号做离散像素采样像素根据覆盖比例 / 滤波结果取中间色值边缘像素呈现深浅不一的红色,视觉平滑无锯齿

频域 (Frequency Domain)
#

频域(frequency-domain)信号是描述信号在频率方面特性的坐标系。

横轴是频率,纵轴是频率变化的幅度

傅里叶变换Fourier Transform
#

傅里叶级数展开
#

任何一个周期函数都可以写成一系列正余弦函数的组合+一个常数项,我们可以用傅里叶展开式来近似端数字的信号,随着展开项增多,图像会越来越接贴合。

傅里叶变换
#

傅里叶展开傅里叶变换不是一回事,但是很相似

  • 傅里叶变换可以把一个函数从时域变到频域

任何周期函数,都可以看作是不同振幅、相位的正弦波的叠加,比如某个周期函数经过傅里叶变换后得到下面五个函数的叠加,频率递增。用同样的采样频率采样这五个函数,随着信号频率递增,采样结果越来越表现不了原来信号的图像,所以更高频率的信号需要更快的采样速度!

而采样跟不上频率则会产生走样现象.

可以看到在采样确定的情况下,频率增加,导致同样的采样下无法区别出不同频率的曲线.

具体傅里叶分析知识请看Heinrich大佬的讲解

图像与频域
#

这是数字图像处理中二维傅里叶变换(2D Fourier Transform)的经典演示,左右两图对应空间域频率域,是频域分析入门示例。

左右图解析*

左图:空间域(原始图像)

  • 本质:灰度人像照片,是图像的空间 / 时域直观表达
  • 特征:像素灰度值直接对应位置亮度,可直观识别人物、动作、背景

右图:频率域(幅度谱)

  • 本质:左图经 2D 傅里叶变换生成的幅度谱,是频率域表示
  • 转换逻辑:将 “像素位置 + 亮度” 的空间描述,转为 “频率分量 + 幅度 / 相位” 的频率描述
  • 关键处理:经频谱中心化(fftshift)低频移至中心,高频分布在四周

频谱图核心解读

1. 中心亮斑(低频分量)

  • 对应特征:图像亮度变化平缓的区域(皮肤、大面积色块、模糊背景)
  • 能量特点:中心亮度最高,低频能量占比最大,决定图像主体结构
  • 星芒线条:由图像水平 / 垂直边缘(轮廓、褶皱、边界)产生,对应高频分量的方向特征

2. 四周暗区(高频分量)

  • 对应特征:亮度变化剧烈的区域(头发丝、手指边缘、纹理、噪点)
  • 能量特点:高频能量远低于低频,画面整体偏暗,仅中心附近有微弱细节

3. 十字辅助线

标注频谱中心(原点),区分水平 / 垂直频率轴,辅助理解频域坐标体系

核心意义与误区

核心意义

  1. 频率分离:拆分图像整体结构(低频)细节 / 噪声(高频),为后续处理奠基
  2. 频域滤波:实现低通(模糊 / 去噪)、高通(锐化)、去除周期性噪声等操作
  3. 特征提取:用于图像压缩、特征匹配、目标检测等任务

常见误区

  • ❌ 错误:中心为高频、周围为低频
  • ✅ 正确:中心化后中心低频,越往四周频率越高
  • 补充:频谱含幅度谱(展示亮度分布)与相位谱(决定图像结构),后者是图像结构的核心

滤波 Filtering
#

过滤某种频率的信号。

高通滤波(high-pass filter)
#

  • 只有高频信号可以通过,只剩下高频信息,丢掉低频信息
  • 特征:仅保留了图像的高频信息(亮度剧烈突变的区域),即人物轮廓、发丝、手指边缘、衣服褶皱等细节;低频的平滑区域(皮肤、大面积色块、背景)被完全滤除,呈现黑底白边的边缘效果。

低通滤波(low-pass filter)
#

  • 只有低频信号可以通过,只剩下低频信息,丢掉高频信息

带通滤波 ( band-pass filter)
#

带通滤波,允许限定频段的波通过,通常是将一张图片经过傅里叶变换得到频域,然后去掉高于限定的最高频和低于限定的最低频信号,如下图中右侧,像一个圈圈一样,经过逆傅里叶变换就可以得到左侧的图像。

卷积 Convolution
#

  • 卷积在图形学中简化的理解

卷积实际上就是定义一个滤波器(滤波器也被称之为卷积核),这个滤波器可以是一维数组也可以是二维数组,使用这个滤波器对原来的信号挨个进行处理,然后把处理好的结果写进一个与原数据相同大小的容器中,滤波的本质是将信号与滤波器在时域上进行卷积的操作。(form https://www.yuque.com/gaoshanliushui-mbfny/sst4c5/agupih#3cf7f234)

卷积的定义
#

  • 原始信号的任意一个位置,取其周围的平均
  • 作用在一个信号上,用一种滤波操作,得到一个结果Result

卷积定理
#

空域中的卷积 = 频域中的乘积,反之亦然(vice versa)

Option 1:空域卷积滤波(直接法,对应上图的滑动窗口以及下图中的上半部分)

  • 原理:用卷积核(滤波器)在图像 / 信号上逐像素滑动,对邻域做加权求和,生成新像素值(一维信号→二维图像的直接扩展)
  • 图形学对应:实时渲染中直接在像素空间实现滤波,如 3×3 高斯模糊、Sobel 边缘检测、抗锯齿的超采样
  • 计算复杂度:O(N2K2)(N为图像尺寸,K为卷积核尺寸),核越大计算呈平方级变慢

Option 2:频域乘积滤波(变换法,基于卷积定理,下图中的下半部分)

分三步实现,完全对应图中流程:

  1. 傅里叶变换(FFT):将原始图像 f(x,y) 和卷积核 g(x,y) 从空域变换到频域,得到频谱 F{f} 和 F{g}
  2. 频域逐元素相乘:将两个频谱逐点相乘,得到滤波后的频域结果 F{f}⋅F{g}
  3. 逆傅里叶变换(IFFT):将乘积结果变换回空域,得到最终滤波后的图像 f∗g
  • 计算复杂度:O(N2logN)(与卷积核大小无关,仅和图像尺寸相关)

卷积盒(Box Filter)
#

乘以1/9的原因——对处理结果进行归一化:卷积操作时原图像中的9个像素卷积盒中的元素分别相乘再相加,得到的是原来的9倍,会导致图像异常明亮。

图像中小的正方体对应低通滤波器,更大的正方体对应只允许更低频率通过的滤波器

  • 核越宽(空域越大),频域主瓣越窄,通带频率越低,模糊越强;核越窄,通带越宽,模糊越弱。

从频域看采样
#

采样(Sampling):采样就是重复频率上的内容

从原理分析如何减少反走样
#

走样的本质

采样速度不够快,导致信号中间间隔小,进而导致信号混在一起,形成走样

$$ \boldsymbol{\text{频谱间隔} = f_s = \frac{1}{T}} $$

采样间隔 T 增大 → 采样率 fs​=1/T 降低 → 原始频谱的周期延拓周期缩短 → 相邻频谱副本之间的保护间隔减小

如何做反走样
#

  1. 方法一:增加采样率 本质上增加了采样时频谱中副本之间的距离 使用更高分辨率的显示器、传感器、更高规格的帧缓冲区 但是:成本非常高,可能需要非常高的分辨率

  2. 方法二:反走样 Antialiasing 反走样:先模糊再采样

首先进行低通滤波,去除高频信号,最大限度保留信号原有的样子,又缩小间隔,不会发生混叠,进而达到反走样的目的。

多重采样抗锯齿 Multisample Antialiasing (MSAA)
#

先提一下 超采样抗锯齿(Super Sample Anti-aliasing, SSAA)

SSAA 是最原始、效果最好但也最消耗性能的抗锯齿技术。

  • 工作原理
    它的原理非常直接:“先放大,再缩小”

    1. 显卡会以远高于显示器分辨率的规格(例如 4 倍,即 4xSSAA)来渲染整个游戏场景。
    2. 渲染完成后,再将这个超高分辨率的图像缩小到显示器原生分辨率进行输出。
    3. 在缩小的过程中,原本锯齿状的边缘会因为像素的混合而变得非常平滑。
  • 优点

    • 画质顶级:因为它对整个场景的所有像素(包括物体边缘、半透明材质、纹理细节等)都进行了超采样,所以抗锯齿效果是最全面、最完美的。
  • 缺点

    • 性能开销巨大:显卡需要渲染的像素量成倍增加,对 GPU 和显存带宽的压力极大,会导致游戏帧率严重下降。因此,它在实时游戏中很少被使用,更多见于对画质要求极高的离线渲染(如电影特效)。

多重采样抗锯齿(Multisample Anti-aliasing, MSAA),借鉴SSAA的理念,以更加高效的方法实现抗锯齿。其具体实现方法如下:

  1. 原本一个像素只在其中心点采样一次,是不可能知道每个像素的覆盖率的,因为非0即1

  2. 这时候需要使用更多的像素点来检测每个像素的覆盖率.需要注意的是这些像素点是虚拟的,用来作为采样存在的.

原本的inside(x,y,t)传入的点不再是像素中心点(x+0.5,y+0.5) 而是四个子采样点坐标(x+0.25,y+0.25),(x+0.25,y+0.75),(x+0.75,y+0.25),(x+0.75,y+0.75) 若一个像素被覆盖n个子采样点,则该像素 覆盖率 为(n/4)x100%

  • 覆盖率计算完毕则得到每个像素被三角形覆盖的百分比, ==到这里只是模糊操作完毕==
  1. 模糊后再进行采样(采样每个像素的颜色)
    像素的颜色=覆盖率x三角形颜色

MSAA绝对不是增加分辨率来解决走样问题,增加采样点的目的只是为了算覆盖率

详尽的对于MSAA的讲解可以去看知乎的这篇文章 : 深入剖析MSAA - fengliancanxue的文章 - 知乎

快速近似抗锯齿 Fast Approximate Anti-Aliasing (FXAA)
#

它是一种和采样无关,在图像层面做的处理,处理过程是先找到三角形的边界,把有锯齿的边界替换为没有锯齿的边界,而且处理起来非常快.

时间抗锯齿 Temporal Anti-Aliasing (TAA)
#

最大的特点就是非常快速,是将静态的图片在时间上进行采样,图像不错MSAA,相连两帧显示的图像是一样,但是可以用相邻两帧同一个像素上不同位置的点来感知是否在三角形内,计算的时候要考虑上一帧感知的结果要被应用进来,相当于是MSAA对应的样本分布在时间上,并且当前这帧没有任何额外的操作

深度学习超级采样 Deep Learning Super Sampling (DLSS)
#

它依赖深度学习,使用低分辨率图像(比如1080p)生成高分辨率图像(8K),再把8K图像缩回4K,得到抗锯齿图像,以代替传统的时间抗锯齿等技术

可见度/遮挡
#

画家算法: (对三角形排序)先画远处的三角形,然后近处的三角形覆盖远处.

但是画家算法会碰到一个问题,不适合在计算机中绘制互相遮挡的图形,如下的三角形.

Z-buffer 深度缓存
#

Z-buffer 无法处理透明物体

  • 不对三角形进行排序,在每个像素上对z值 比大小
  • 用一块缓存,存放每个像素的深度信息
  • 得到最终渲染图像的同时会有一个深度缓存产生 1、frame buffer 存放每个像素的颜色 2、depth buffer 存放每个像素的深度信息(也叫z-buffer)
  • 注意相机看向-z轴,为了方便计算对z轴数值取绝对值,z越大越远

伪代码:

图像示例:

近像素(小)盖住远像素(大)

  • 更小->更新
  • 更大->不变
  • 相同:深度冲突