Rasterization 2 (Antialiasing and Z-Buffering)
Sampling theory
Sampling Artifacts in Computer Graphics
- Aliasing 锯齿
- Moiré Patterns in Imaging 摩尔纹
- Wagon Wheel Illusion (False Motion) 车轮效应
对于旋转方向的错误感知
Artifacts due to sampling - “Aliasing”
Jaggies – sampling in space
Moire – under sampling images
Wagon wheel effect – sampling in time
原因:信号变化的速度太快了但采样太慢了
Blurring (Pre-Filtering) Before Sampling 在采样前模糊
- 原始的采样

- 经过模糊(滤波)后的采样

- 在实际应用中的效果

- 注意:不能先采样再做模糊,会导致锯齿被模糊

Frequency Domain 频域
Frequencies
- 定义 cos 2 π f x \cos 2\pi fx cos2πfx 中的 f f f 为频率
- f = 1 T f=\frac{1}{T} f=T1
Fourier Transform 傅里叶变换
- 任何周期函数都可以被展开为 sin x \sin x sinx 和 cos x \cos x cosx 的和的形式
- 把图像从时域(图像空间)变为频域(频率空间)
在这样的条件下,可以发现,频率越高的函数需要更高的采样频率
- 走样的定义:同样采样方法采样两种不同频率的函数无法区分它们
Filtering 滤波
- 解释:Getting rid of certain frequency contents (去掉一系列的频率)
这是一个图像经过傅里叶变换后的频域图
在经过高通滤波(去掉低频信息)之后,可以提取出图像的边界
高频信息对应图像边界的理由:图像的边界的左右两侧发生了剧烈的变化,是高频信息
反之,低通滤波(去掉高频信息)就对应了边界被模糊的情况
如果留下某一段的频率,就留下的是一部分的边界信息
Convolution 卷积
- Convolution in the spatial domain is equal to multiplication in the frequency domain, and vice versa
- 作用
- Option 1: Filter by convolution in the spatial domain
- Option 2:
- Transform to frequency domain (Fourier transform)
- Multiply by Fourier transform of convolution kernel
- Transform back to spatial domain (inverse Fourier)

卷积定理的一个例子
Box Filter 滤波盒
采样的本质
- Sampling = Repeating Frequency Contents
锯齿的本质
- Aliasing = Mixed Frequency Contents
Antialiasing 抗锯齿
抗锯齿的方法
- 增加采样率:扩大频谱的搬移间隔
- 需要高分辨率显示设备
- 先做模糊(低通滤波),再做采样
反走样在像素层面的解决方案
求平均:Convolve f ( x , y ) f(x,y) f(x,y) by a 1-pixel box-blur
Recall: convolving = filtering = averaging
通过边界占像素的比例来觉得像素亮度从而完成模糊过程
采样:Then sample at every pixel’s center
Antialiasing By Supersampling (MSAA)
- 这是一个近似反走样的操作,不能完全的实现反走样
- 这是一个对信号的模糊操作,不是真正的靠提升像素的分辨率来实现的
- 这个操作使用了更多的点对三角形是否在像素内进行了测试,增大了计算量(例如把一个像素分为 2 × 2 2\times 2 2×2 的方格就增大了 4 4 4 倍的计算量
MSAA 的步骤
- Supersampling
将每个像素切分成 2 × 2 2\times 2 2×2 的方格,对方格中的每个点计算其是否在三角形内,根据每个像素在三角形内的点的个数决定发光的强度



- Sampling
对图像根据模糊操作得到的值进行采样
更多的抗锯齿方法
- FXAA (Fast Approximate AA):本质的图像的后期处理,先得到有锯齿的图像,再将边界找到,将其换成没有锯齿的边界
- TAA (Temporal AA):去找上一帧的信息来进行模糊,如果是静态图片就用每一个像素内不同的点来感知边界,在当前帧上没有额外操作
- 超分辨率(与抗锯齿本质相同):使用深度学习猜测和补充细节
Z-Buffering 深度缓冲
Painter’s Algorithm 画家算法
- Paint from back to front, overwrite in the framebuffer
- Requires sorting in depth ( O ( n log n ) O(n \log n) O(nlogn) for n n n triangles)
- Can have unresolvable depth order
- 如果两两存在覆盖关系,就无法定义深度顺序,如下图
Z-Buffer 深度缓存
现代使用的算法
Store current min. z-value for each sample (pixel) 此算法是针对像素的,操作针对像素,维护的是像素
在生成图像时,同步生成两张图
frame buffer(最后的结果) stores color values
depth buffer (z-buffer 深度信息) stores depth
为了方便起见,假设
- z is always positive (smaller z → \to → closer, larger z → \to → further)
深度缓存算法和顺序无关(假设没有两个三角形在任何一个像素中没有相同深度,因为三角形的坐标基本都是使用浮点型存储,基本可以认为两个三角形没有相等的深度)
无法处理透明物体的深度
实际上,在生产环境还是有可能产生深度相同的情况,此课不讨论
深度缓存例子

算法流程
例如,第一个三角形的深度为 5 5 5,更新 frame buffer, z-buffer。再叠加另一个三角形时,根据上述算法流程部分覆盖,这样第二个三角形的部分就会被遮挡
时间复杂度
假设一次操作,对于一个三角形而言的所要更新的像素为常数 C C C (通常在 100 100 100 个左右),时间复杂度为
- O ( n ) O(n) O(n) for n n n triangles (assuming constant coverage)
- 此处并没有排序,只是记录每个像素的最小值