原文地址:link

最近在学习计算机图形学,发现闫令琪教授在B站讲授的GAMES101非常好、浅显易懂。本期,整理了光栅化(Rasterization)相关内容。

【GAMES101】光栅化

1 Canonical Cube to Screen

计算机是如何将一个中心在坐标原点,棱长为2的立方体显示在长为heightheight、宽为widthwidth的屏幕中呢?

  • zz轴无关,暂时忽略zz轴;
  • xOyxOy平面左边由[1,1]×[1,1][-1, 1]\times[-1, 1]转化到[0,width]×[0,height][0, width]\times[0, height]

【GAMES101】光栅化

答案是使用变换呗,准确地说是通过缩放平移变换,视口变换矩阵(viewport transform matrix)如下:
Mviewport=(width200width20height20height200100001). M_{viewport} = \left( \begin{matrix} \color{blue} \frac{width}{2} & \color{blue} 0 & \color{blue} 0 & \color{red} \frac{width}{2} \\ \color{blue} 0 & \color{blue} \frac{height}{2} & \color{blue} 0 & \color{red} \frac{height}{2} \\ \color{blue} 0 & \color{blue} 0 & \color{blue} 1 & \color{red} 0 \\ 0 & 0 & 0 & 1 \end{matrix} \right).

2 Rasterization: Drawing to Raster Displays

光栅化就是考虑如何将图像呈现在光栅显示器中。

一般将图像拆分成许多不同的三角形????进行显示。

<【GAMES101】光栅化, 【GAMES101】光栅化>

3 A Simple Approach: Sampling

如何将三角形显示在屏幕中?

【GAMES101】光栅化

很显然,三角形内部的点显示,三角形外部的点不显示。

那么,问题就转化为如何判断屏幕中一个像素是否在三角形内部呢?

【GAMES101】光栅化

使用三个叉积判断点QQ是否在P0P1P2\triangle P_0P_1P_2中,即判断P0P1×P0Q\overrightarrow{P_0P_1} \times \overrightarrow{P_0Q}P1P2×P1Q\overrightarrow{P_1P_2} \times \overrightarrow{P_1Q}P2P0×P2Q\overrightarrow{P_2P_0} \times \overrightarrow{P_2Q}的符号是否一致(同负同正)。

接下来就可以遍历屏幕像素将三角形显示在屏幕中了,有两种较为高效的扫描遍历策略Bounding Box和Incremental Triangle Traversal。

<【GAMES101】光栅化, [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CluYxq7V-1594813851137)(https://imgkr.cn-bj.ufileos.com/d43b3e3b-753b-4849-bdf6-d093c1ca6c77.jpg)]>

4 Antialiasing (Jaggies)

4.1 Aliasing

但是,问题来了。这样扫描的图形会出现锯齿(Jaggies)状的边界、摩尔纹(Moiré Patterns)等导致图像走样。

【GAMES101】光栅化

4.2 Antialiasing idea

怎么才能反走样呢?一种反走样方法是在采样之前进行模糊操作

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6lbfx7mh-1594813851150)(https://imgkr.cn-bj.ufileos.com/f029a357-4b5d-427a-86b0-2c9400ffe17a.jpg)]

效果还不错!!!

能不能先采样再模糊操作呢?答案是不能的。

【GAMES101】光栅化

为什么采样过稀疏会导致锯齿现象呢?为什么先进行**滤波操作(模糊操作)**然后采样就好了呢?

模糊操作本质上是一种滤波,滤波本质上是消除掉某些频率信息。

让我看探究一下深层原因吧。

4.3 Frequency domain

4.3.1 Fourier transform

自然界中的一切信号都可以由不同频率的正弦和余弦波组合而成。

【GAMES101】光栅化

傅里叶变换可以将信号由空间域(Spatial domain)转换到频域(Frequency domain)。

Fourier Transform Decomposes A Signal Into Frequencies

【GAMES101】光栅化

高频信号应该增大采样率以防止失真。

【GAMES101】光栅化

采样不足会导致失真。

【GAMES101】光栅化

4.3.2 Filtering

下面我们通过傅里叶变换看一下图像的频域信息,中心代表图像的低频信息(变化不大的地方),远离中心代表图像的高频信息(纹理)。所以,频域能量集中在中心表示图像的低频信息较多。

【GAMES101】光栅化

两种滤波,如下:

  • Low-pass filter:阻高频、通低频;
  • High-pass filter:通高频、阻低频。

<【GAMES101】光栅化, 【GAMES101】光栅化>

4.3.3 Convolution

【卷积定理】在空间域的卷积等于在频域的乘法,反之亦然。

Filtering = Convolution (= Averaging)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VXlmkzMb-1594813851187)(https://imgkr.cn-bj.ufileos.com/c03f5c4f-cfa8-4e94-8ebc-62f452020a95.jpg)]

4.3.4 Sampling

采样的本质等价于重复频域的内容

Sampling = Repeating Frequency Contents

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lGImyTUj-1594813851191)(https://imgkr.cn-bj.ufileos.com/6c664313-5a2f-4dd6-b8d6-535a52282fab.jpg)]

走样的本质是频域信息重叠在一起

Aliasing = Mixed Frequency Contents

【GAMES101】光栅化

反走样的本质就是滤波后稀疏采样,对应频域信息是限制频域内容然后重复。

Antialiasing = Limiting, then repeating

【GAMES101】光栅化

到此,原理部分完结!

4.4 Supersampling

超采样是通过对一个像素内的多个位置进行采样并对其值进行平均来近似1个像素盒滤波器的效果。

【GAMES101】光栅化

Supersampling结果如下:

【GAMES101】光栅化

相关文章: