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缓冲无法处理透明物体

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐