找回密码
 立即注册
查看: 367|回复: 0

《GAMES101-现代计算机图形学入门》-05~06“Rasterization ...

[复制链接]
发表于 2022-10-7 08:00 | 显示全部楼层 |阅读模式
Lecture 05 Rasterization 1 (Triangles)

1) 回顾

先简单回顾补充一下上一节的透视投影,我们在上一节中学到,无论是透视投影还是正交投影,我们最后都会将模型变换到一个立方体中,对于透视投影中的视锥体,我们会将远平面变换成与近平面相同的面,那么,我们该如何获得近平面上下左右四条边的信息呢?


这个我们可以通过屏幕的长宽比和竖直方向上的可视角度(field-of-view)利用相似三角形的关系来计算得到,再加以利用对称性,只需计算两条边的信息即可


2) 标准化设备坐标与到屏幕空间

三维物体在经过MVP(Model、View、Projection)变换以后,都会处于一个标准立方体中,那么这个标准立方体的作用是什么呢?


a) 认识屏幕

首先我们需要对屏幕有一些了解,屏幕就是一个储存许多像素点的数组,这个数组的大小就由屏幕的分辨率决定,同时,屏幕还是一个典型的光栅显示器(德语中光栅就是指屏幕),而光栅化就是在屏幕上进行绘制。像素是指屏幕上一个个的带有统一化(通过RGB来表示,也可以是灰度值)颜色的小方格


下面包含一些屏幕空间的定义,需要注意的是这里的坐标系中原点位于屏幕的左下角


b) 变换坐标

了解了屏幕后,我们现在的任务就是将标准立方体变换到屏幕空间上,因为屏幕是二维的,所以我们不需要考虑z方向的分量


这一变换矩阵如下:先将标准立方体拉伸到与屏幕宽高相匹配,再将拉伸后立方体的中心由左下角移到屏幕的中心


<hr/>光栅显示设备统统跳过喵
3) 采样(Sampling)

上面已经提到了如何将三维空间中的顶点转换到屏幕空间中,我们的下一步是将各种不同的多边形显示在光栅显示设备上,下面我们以三角形为例:
a) 三角形




由多个三角形组成的三维模型



由三角形组成的二维图形

我们可以看出,三角形是一种基础的图元,同时也是最基础的多边形,它有许多特殊的性质:

  • 一个三角形一定是一个平面
  • 三角形内部和外部的定义清晰(可以使用叉乘判断)
  • 三角形内进行插值很方便


那么如果我们使用三角形作为图元,将其显示在屏幕上时边缘区域的像素点该如何着色就是我们的下一步任务


b)图形学中的采样

采样是抽取函数中的一个点,也就是将一个函数离散化的过程,采样是图形学中的一个重要概念,它在一维、二维、三维等方面均被广泛应用,如对时间的采样,方向的采样


通过对像素点中心的采样,我们就可以完成上面提出的任务:定义一个二值函数,当像素中心点在三角形内部时像素值取1,否则取0




代码举例如下(遍历图片中的每一个像素):


再深入一点,我们还需要考虑如何判断一个点在三角形的内部还是外部,这点可以通过三次向量叉积来得到:         P_1P_2\times P_1Q ,\  P_2P_0\times P_2Q ,\  P_0P_1\times P_0Q  ,当三个向量叉积均为1或0时,点 Q 在三角形内部,否则在三角形外部


对于下图这种点的中心恰巧落在两个三角形公共边上的情况,我们可以选择自己定义判断方法(需合理),也可以选择对改点不进行处理


当我们在遍历图片的像素点时,有那么一些点总是不会落在三角形内部的(如下图白色区域),我们并不需要对这些像素点进行判断检测,因此,我们可以取三角形水平和竖直方向上的顶点坐标分量最大值和最小值构造一个矩形区域,我们在遍历时只需遍历矩形区域内的点即可,这一矩形区域被称为包围盒(Bounding Box, also Axially Aligned Bounding Box, namely AABB)


当然我们还有其他的加速采样的方法


c) 现实中的采样





d) 采样的缺陷



对于上面这样的一个信号,我们将其展示在屏幕上时会变成下图的形状,三角形的边缘会有许多锯齿般的形状,我们称之为走样(Aliasing),这一问题来源于像素本身带有一定的大小以及我们对于信号的采样率不够高,为了解决这一问题,下面我们将要了解到反走样(也叫抗锯齿)




<hr/>Lecture 06 Rasterization 2 (Antialiasing and Z-Buffering)

1) 反走样

a) 采样

采样是图形学中的一个非常常见的概念:

  • 光栅化是指对屏幕空间上的二维像素点进行采样
  • 照片是对图像传感器平面的采样
  • 视频是由一帧一帧的画面按时间顺序组合而成,相当于是对时间的采样






b) 图形学中采样的问题(Artifacts)


  • 锯齿(Jaggies)(空间上)
  • 摩尔纹(Moire)(空间上)
  • 车轮效应(Wagon wheel effect)(时间上)
  • ……








导致这一切问题的原因是:信号的变化频率过快,我们的采样频率跟不上


由下图可以看出,在相同的采样频率下,信号频率越高,我们对于信号恢复的还原度就越低,因此要想很好的还原信号,对于频率较高的信号,我们也需要较高的采样频率


c)走样

若以某一采样频率采样如下图的两个频率截然不同的信号,得到的采样值是相同的,即在一个采样频率下,我们无法通过采样值区分两个不同频率的信号,这一现象就是走样


d) 如何实现反走样

要实现反走样,我们需要在采样前进行一个模糊处理(预先的滤波处理),再对处理后的图形采样


下面是进行反走样处理前(左)后(右)的对比


我们可能会考虑改变模糊处理和采样的顺序,先采样再模糊处理(Blurred Aliasing),但是这是不行的,因为这是在图像走样后进行模糊处理


要理解上面这些问题,我们需要先理解一些概念
2) 频域和卷积

a) 频域

我们可以先通过正余弦波来简单理解频率和周期


通过傅里叶级数展开,我们可以将任一函数表示成正弦函数和余弦函数的线性组合(按频率由小到大)与一常量的和


通过傅里叶变换和逆傅里叶变换,我们可以将一个函数(空间域/时域)和不同的频率分段(频域)相互转换


下图就是通过傅里叶变换将一个图片的信号由时域(图片虽然没有时间信息,但空间上的位置信息也可以算在时域里)转换到频域中


我们如何查看一个频域信号的信息(像这种信号的信息在频域中的表达被称为频谱)呢?图像的中心点作为信号频率最低的位置,由中心点向外频率逐渐升高,在不同的位置由它的亮度来表示对应频率所带有的信息,这里可以发现,上面图片的信息主要集中在低频区域(自然的图片基本都是信息集中在低频区域)



图像中的水平和竖直两条线是由图片边缘进行傅里叶变换时产生的极其高的高频信号导致的,我们不用考虑

下面我们对频谱分别进行高通(High-pass,抹除低频信息)低通(Low-pass,抹除高频信息)的滤波处理
高通处理后,我们将频谱进行逆傅里叶变换得到图片发现:图片只保留了原来的轮廓,这是因为在轮廓附近,信号发生了剧烈的变化(如人的衣服到模糊的背景),这些变化所对应的信息就是高频信息,只保留高频信息的图片自然只剩下轮廓可见


再看看经过低通处理的图片,和高通处理联系起来看很容易发现:图片只留下了低频信息,高频信息被抹除,也就是轮廓被抹除,自然只剩下一张模糊的图片,只能看到大概内容,细节部分就很少了


若是只保留一个相对高的频段信息,自然也就只能看到相对模糊的轮廓




b) 卷积

下图表示的是图形学中的卷积:通过一个可以移动的滤波器,对原信号的每一点及其周围的点进行加权平均,对应输出到一个新信号的每一点,该新信号就是经过卷积处理的原信号




c) 卷积定理(Convolution Theorem)

这个在之前104的笔记中有记过,但之前记得很粗糙,这里进行一个补充:


现在利用卷积定理我们求卷积就可以有两种方法:

  • 在时域中利用滤波器求卷积
  • 先将信号由时域通过傅里叶变换转到频域中,根据卷积定理,在频域中求两信号乘积,再通过逆傅里叶变换转回时域


我们来看看利用这两种方法求卷积的效果:

  • 首先是在时域中对一个信号和一个box filter求卷积,等于信号中每个点和它周围八个点的加权平均,这样得到的结果是模糊的原图
  • 而先将原信号和box filter通过傅里叶变换转到频域中,再根据卷积定理使两者相乘,得到的结果通过逆傅里叶变换转回时域,同样得到的是模糊的原图。值得注意的是,box filter的频谱均为低频信息,将原信号的频谱与box filter的频谱相乘,相当于对原信号做了低通处理,得到的结果自然是模糊的





一个3*3的box filter



box filter在时域(左)和频域(右)上的表示

如果我们使用更大的box filter,相当于对每个像素点做加权平均时取周围更多的点,,这样得到的频谱中信息的频率会更低,作为低通滤波器使用只有更低的频率能通过,得到的图像也就更模糊了;小的box filter同理


3) 频域中的采样和走样

我们首先看一下时域中的采样:将原函数与一段对应的冲激函数序列相乘,得到的一系列离散的点就是采样的结果


再看看频域中的采样:根据卷积定理,采样的结果应当等于原函数的频谱和冲激函数序列的频谱的卷积,单从结果来看,采样相当于将原函数的频谱进行许多的重复


现在我们就可以从频域的角度来看走样现象了,当采样率足够高时,对原函数频谱的重复就能够正常进行,就不会出现走样现象,而采样率跟不上,即采样的间隔较大时,间隔越大,复制的间隔越小(两者刚好相反),这时就会出现频谱重叠,无法还原原信号的频谱,也就是造成了走样现象


4) 如何实现反走样

a) 增加采样率

增加采样率理论上可行,但实际是成本巨大的


b) 预先的模糊处理

先做低通处理,再进行采样,这是目前可行的方案


我们先把频谱上高频的部分抹除(即下图中虚线外的部分),以此来减小它们之间的间隔,再进行采样,就可以避免频谱重叠的问题,实现反走样


那么我们怎么做到低通滤波处理呢?我们只需要取一个和屏幕像素一样大的box filter来做低通滤波器即可


总结来说:先使用一个像素大小的box filter和原信号卷积/低通滤波/加权平均(三者在这里是同样的操作),再对信号的每一个点进行采样


加权平均前每个像素内原图所占比例与加权平均后每个像素内的值占原始值的比例相等


5) 多重采样抗锯齿(MultiSampling Anti-Alisaing)

我们可以把一个像素分成许多个小的像素中心(这一操作并不是增加屏幕分辨率),这些小的像素中心不一定是下面的4*4形状,也可以是不规则的或者是呈某种图案分布的。因为增加了许多采样点,自然给我们的计算增加了负担,好在实际采样过程中,许多采样点可能会被邻近采样点复用,所以但这个负担并不是随采样点个数增多线性增加


先对像素内每个小的像素中心采样,再根据这一采样结果计算每个像素内的占比,进而计算像素内的取值






下图是使用了MSAA处理的效果


6) Tips

既然是现代计算机图形学,自然会介绍工业界常用的反走样方法


与反走样类似的,还有一个概念叫超分辨率
百度百科:超分辨率是通过硬件或软件的方法提高原有图像的分辨率,通过一系列低分辨率的图像来得到一幅高分辨率的图像过程就是超分辨率重建。
二者都是由采样率不足引起的问题,也都是要从低分辨率转换到高分辨率,但是超分辨率一般通过深度学习处理解决


<hr/>课程传送门05:Lecture 05 Rasterization 1 (Triangles)_哔哩哔哩_bilibili
课程传送门06:Lecture 06 Rasterization 2 (Antialiasing and Z-Buffering)_哔哩哔哩_bilibili

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-24 23:40 , Processed in 0.089814 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表