Jannish Blog

「现代计算机图形学入门」光栅化

2022/09/15

「现代计算机图形学入门」光栅化

Raster:屏幕(德语)

Rasterize:把东西画在屏幕上

最简单的想法:光栅化 = 采样一个二维指示函数

图1  光栅化三角形
1
2
3
for(int x = 0; x < xmax; ++x)
for(int y = 0; y < ymax; ++y)
image[x][y] = inside(tri, x + 0.5, y + 0.5);

Q:如何判断一个点是否在三角形内?

A:—— 叉积

Q:要检查屏幕上所有的像素吗?

A:—— 使用包围盒

1. 抗锯齿/反走样

由于采样带来的Artifact:

  1. 锯齿 —— 空间上采样;
  2. 摩尔纹 —— 欠采样图像;
  3. 车轮效应 —— 时间上采样;

其本质原因是:信号变化的速度太快了,但是采样的速度跟不上;

1.1 频域

傅里叶级数展开 :用正弦和余弦的组合来表示函数。

傅里叶变换: 时域和频域的转换。

采样失真的原因:高频率信号需要更快的采样

图2  以相同频率对不同三角函数采样

走样到底是什么?

图3  走样到底是什么

对于蓝色和黑色这两种频率不同的信号,采样的结果完全相同。我们无法区分。

滤波 = 去掉部分特定的频率

滤波 = 卷积 (平均)

卷积定理:时域上的卷积 = 频域上的乘积, 或者时域上的乘积 = 频域上的卷积

从频域的角度来看采样的本质:重复原始信号的频谱

  1. 是时域上的原始信号,(b) 是频域上的信号,(c) 是采样函数(冲激函数),(d) 是频域上的采样函数。

根据卷积定理,(a) 和 (c) 做乘积,相当于 (b) 和 (d) 做卷积,即不断重复原始信号。

图4  卷积定理

从频域角度看走样的本质,走样 = 频谱的混合

图5  从频域角度看走样的本质

1.2 如何反走样 ?

  1. 增加采样率。采样频率增加了,频谱复制的距离变大,就不容易发生混合。
  2. 采样前把高频信息去掉。
图6  从频域角度看反走样的本质

1.3 多重采样抗锯齿(MSAA)

通过对一个像素大小内进行平均来反走样,但是这样子很难实现,所以用到了MSAA。

MSAA通过对一个像素内多次采样来进行模糊操作。

2. 深度缓冲

画家算法:从后向前画

Z-Buffer:使用深度缓存来记录每个像素的深度,伪代码如下:

1
2
3
4
5
6
7
8
9
// During rasterization
for(each triangle T)
for(each sample (x,y,z) in T)
if(z < zbuffer[x,y]) // closest sample so far
framebuffer[x,y] = rgb; // update color
zbuffer[x,y] = z; // update depth
else
; // doing nothing, this sample is occluded

时间复杂度:对于n个三角形,O(n)复杂度

算法的优点:与顺序无关

CATALOG
  1. 「现代计算机图形学入门」光栅化
    1. 图1  光栅化三角形
  • 1. 抗锯齿/反走样
    1. 1.1 频域
      1. 图2  以相同频率对不同三角函数采样
      2. 图3  走样到底是什么
      3. 图4  卷积定理
      4. 图5  从频域角度看走样的本质
  • 1.2 如何反走样 ?
    1. 图6  从频域角度看反走样的本质
  • 1.3 多重采样抗锯齿(MSAA)
  • 2. 深度缓冲