当前位置: 代码迷 >> 综合 >> 【GAMES101】光栅化
  详细解决方案

【GAMES101】光栅化

热度:94   发布时间:2024-01-28 16:33:11.0

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yh5KJNUc-1594813851094)(https://imgkr.cn-bj.ufileos.com/0ae25122-8911-418c-affe-76c2baad5394.png)]

1 Canonical Cube to Screen

计算机是如何将一个中心在坐标原点,棱长为2的立方体显示在长为 h e i g h t height 、宽为 w i d t h width 的屏幕中呢?

  • z z 轴无关,暂时忽略 z z 轴;
  • x O y xOy 平面左边由 [ ? 1 , 1 ] × [ ? 1 , 1 ] [-1, 1]\times[-1, 1] 转化到 [ 0 , w i d t h ] × [ 0 , h e i g h t ] [0, width]\times[0, height]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XCsijM5h-1594813851098)(https://imgkr.cn-bj.ufileos.com/a0c33c0e-7360-4ab7-be33-d4967e116b21.jpg)]

答案是使用变换呗,准确地说是通过缩放平移变换,视口变换矩阵(viewport transform matrix)如下:
M v i e w p o r t = ( w i d t h 2 0 0 w i d t h 2 0 h e i g h t 2 0 h e i g h t 2 0 0 1 0 0 0 0 1 ) . 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

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

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

<Triangle Meshes, Triangle Meshes>

3 A Simple Approach: Sampling

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fQcvQfth-1594813851124)(https://imgkr.cn-bj.ufileos.com/f7027e38-1e63-4423-80b4-bb9ceb3c53be.jpg)]

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

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

Three Cross Products

使用三个叉积判断点 Q Q 是否在 P 0 P 1 P 2 \triangle P_0P_1P_2 中,即判断 P 0 P 1 × P 0 Q \overrightarrow{P_0P_1} \times \overrightarrow{P_0Q} P 1 P 2 × P 1 Q \overrightarrow{P_1P_2} \times \overrightarrow{P_1Q} P 2 P 0 × P 2 Q \overrightarrow{P_2P_0} \times \overrightarrow{P_2Q} 的符号是否一致(同负同正)。

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

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

4 Antialiasing (Jaggies)

4.1 Aliasing

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

Jaggies

4.2 Antialiasing idea

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

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

效果还不错!!!

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

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

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

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

4.3 Frequency domain

4.3.1 Fourier transform

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

使用正弦波来近似表示方波

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

Fourier Transform Decomposes A Signal Into Frequencies

傅里叶变换

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

采样不足会导致失真。

4.3.2 Filtering

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

傅里叶变换图示

两种滤波,如下:

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

<, >

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

Dense & Sparse sampling

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

Antialiasing = Limiting, then repeating

Antialiasing

到此,原理部分完结!

4.4 Supersampling

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

Supersampling

Supersampling结果如下:

Supersampling result