GAMES101课程学习笔记—Lec 05~06:Rasterization 光栅化
GAMES101课程学习笔记—Lec 05~06:Rasterization 光栅化
1 从标准化设备坐标到屏幕
之前我们通过MVP矩阵把物体坐标变换到标准化设备坐标(每个顶点的x,y,z坐标都应该在-1.0到1.0之间)
那么接下来我们需要把它映射到屏幕中
那么就会产生以下问题

- 何为屏幕?
在图形学中,我们认为屏幕是一个二维数组,数组里的每一个元素为一个二维像素。
屏幕是一个典型的光栅成像设备
光栅化的过程就是把东西画在屏幕上的过程 - 何为像素?
在这门课中我们暂时认为它是小的方块,内部的颜色是一个整体的颜色,颜色值用RGB表示。
我们同样需要定义屏幕的空间

- 屏幕空间即在屏幕中建立坐标系,XOY平面
屏幕空间坐标为整数,范围从(0,0)到(width-1,height-1)
像素(x,y)中心在(x+0.5,y+0.5)
通过视口变换可以将标准化设备坐标映射到屏幕坐标(暂时先不管Z)

视口变换后,我们要把这些多边形显示在光栅显示设备上

关于光栅显示设备的知识在此不作记录了
2 从图形到光栅显示
上文的老虎由不同的四边形组成,也有很多例子是靠三角形组成

三角形是最基本的多边形,拥有很多特性

- 三角形可以分解其他的多边形
- 三角形保证是平面的
- 三角形的内外定义清晰,可以用叉乘判断内外
- 三角形内可以定义明确的插值方法
接下来以三角形为例
在经过视口变换之后,我们知道了三角形变换到屏幕空间的位置,那么像素该如何显示呢?如何判断像素和三角形呢?

2.1 采样
采样也就是把一个函数离散化的过程
以下的图片展示了利用像素中心对屏幕空间的三角形进行2D采样的过程


我们定义了一个inside函数,判断了像素中心是否在三角形内部
伪代码的形式就像下图,遍历像素,判断是否inside

这个inside函数如何实现判断点Q呢?
我们要做的是叉乘
判断
P
1
P
2
×
P
1
Q
P_1P_2 × P_1Q
P1P2×P1Q,
P
0
P
1
×
P
0
Q
P_0P_1×P_0Q
P0P1×P0Q,
P
2
P
0
×
P
2
Q
P_2P_0×P_2Q
P2P0×P2Q这三个结果是否同向

对于边界上的点,我们不做处理。实际上我们定义一个标准,随意分配就好。
我们不必采样所有的屏幕,用包围盒的概念可以加速,在最小范围内采样。

也可以有其他各种多样的加速方法

2.2 实际的光栅化
以下展示了现实中的光栅化显示设备的显示方法

2.3 采样的缺点
我们经过采样后的图案是锯齿状的

像素本身有一定的大小,同时我们的采样率对于信号来说不够高(下面会详细描述),造成了锯齿问题。
于是我们就要接触到,走样与反走样。

3 反走样
此处的反走样介绍,用自己图形学这门课的期末论文来描述吧。
(当初是以闫老师的这个视频为契机写的反走样技术的论文综述)
此处对信号处理的知识不做很多描述了,可以看闫老师的原视频,频域分析讲的非常通俗直观易懂
3.1 引入


3.2 走样现象





3.3 基于超采样的反走样方法
3.3.1 SSAA(Supersampling Anti-Aliasing)

3.3.2 MSAA(Multisample Anti-Aliasing)


3.4 基于形态学的反走样方法

3.4.1 MLAA(Morphological Antialiasing) & SMAA(Subpixel Morphological Antialiasing)




3.4.2 FXAA(Fast Approximate Anti-Aliasing)


3.5 基于时间的反走样方法

3.5.1 TAA(Temporal Anti-Aliasing)









3.6 深度学习反走样

4 可见度/遮挡
4.1 Z缓冲
在之前的绘制过程中我们没有考虑Z的信息,那么如何画出前后关系以及深度呢?
这时候就要用到Z缓冲。
深度值存储在每个片段里面(作为片段的z值),当片段想要输出它的颜色时,我们会将它的深度值和z缓冲进行比较,如果当前的片段在其它片段之后,它将会被丢弃,否则将会覆盖。
这个过程称为深度测试(Depth Testing)

示例Z缓冲的使用(R为无限远)

三角形进入顺序和结果无关
Z缓冲无法处理透明物体
更多推荐
所有评论(0)