现代计算机图形学入门(三)——光栅化


一、采样

1. 三角形

我们在光栅化的过程中,需要把不同的像素转化为多边形。有的是四边形,但更为广泛的是使用三角形。三角形有如下的好处:

  • 三角形是最基础的多边形,没有比三角形边更少的多边形
  • 任何其他多边形都可以拆为三角形
  • 三角形的内部一定是在一个平面的,而四边形就可能不会
  • 三角形的内外区分非常清楚,但是对于多边形而言,由于存在凸多边形和凹多边形所以区分比较麻烦
  • 通过三角形三个顶点的左边便于判断三角形内像素的中心点与三角形的关系
    在这里插入图片描述

2. 应用

在图形学中,我们会利用 采样(Sampling)的方式,来判断像素是否在三角形内,我们定义像素如果在三角形里则为1,不在则为0,然后对每个像素求值来进行判断
在这里插入图片描述
写成伪代码的形式即为:
在这里插入图片描述
接下来我们既要考虑这个函数inside如何实现,此时我们想起了之前叉积的知识通过三条边与采样点向量之间的叉积来判断点与三条边的关系,进而判断点于三角形之间的关系。

对于三角形的光栅化,我们使用 包围盒(Bounding Box)来帮助,对于在包围盒外面的像素,就不用去考虑光栅化,只有包围盒区域内的像素才需要循环考虑,就不需要完全从0-width或0-height。
轴向包围盒
但是有的三角形使用包围盒它也可能会需要覆盖很大的区域,比如钝角三角形,它其实没有占多大像素,但是包围盒却很大,所以我们会采用更优化的包围盒对待这类三角形,就是对每个三角形内的像素加上它左和右的像素生成一个新包围盒:
在这里插入图片描述
由于像素内的颜色是均匀的,并且像素块是否在三角形内是由三角形中心决定的,所以对于一个三角形,我们采样后得到的值显示成图像是这样的:
在这里插入图片描述
因此会导致 锯齿(Jaggies),这是由于像素本身是有一定大小的额并且采样率对于信号来说是不够高的,这在光栅化上被称为信号的 走样问题(Aliasing)。

二、走样(Aliasing)

1. 傅立叶变换(Fourier transform)

首先我们需要了解傅里叶级数展开,也就是任意一个周期函数,我们都可以把它们写成一系列正弦与余弦函数的线性组合
在这里插入图片描述
其中f(x)中展开的不同三角函数拥有不同的频率
在这里插入图片描述
由此,我们引出了傅里叶变化,也就是一个函数我们可以通过变换,变成另外一个函数,同时变换得到的函数也可以通过逆变换变回原函数
在这里插入图片描述
我们对傅里叶变换后的不同函数进行采样,我们发现每隔一段时间采样,频率越大的函数采样恢复出的函数与原来的函数相似度越来越远,这就形成了走样
在这里插入图片描述
现在我们假设有这样两个信号,我们对蓝色信号采样和对黑色信号采样后得到的曲线都是黑色曲线,也就是同样一种采样方法采样两种不同频率的曲线,我们无法区分结果,这也就是走样的标准定义:
在这里插入图片描述

2. 滤波(Filtering)

滤波指的是把某个特定的频段删掉,这就需要我们的傅里叶变换,把图像从时域变换成频域,例如以下这幅图,我们定义图像的中心是低频区域,图像的周围是高频区域,从中心往周围频率会变的越来越高,通过亮度来表示不同位置的频率,密度,图中央显示了低频信息非常多,图四周显示了高频信息非常少,事实上大部分图像都是这样的性质。图中的频率图会显示两条线,一条水平一条竖直,这是因为在边界上,会认为图像是无限重复延伸的,由于一半图像的左边界与右边界,上边界与下边界都是不一样的,所以会产生非常高频的信号。
在这里插入图片描述
此时我们如果把频谱图的低频信号全部抹掉,然后再逆傅里叶变换回图像,则可以看到图像内容上的边界,这也就是高通滤波(High-pass filter),这是因为在边界上会变化的很大,产生非常高频的信息,也就是得到图形边界
在这里插入图片描述
相应的只留下低频信息,即为低通滤波(Low-pass filter),那就会得到一张模糊图形,不过得到的图像中有一些水波纹的部分,这是一个不完美的低通滤波导致的
在这里插入图片描述
如果同时把高频和低频都去掉,那就会提取到一些不是很明显的频率信息
在这里插入图片描述

3. 卷积(Convolution)

对于一串信号,我们使用一个带有窗口的滤波器对窗口内信号进行点乘,结果写回窗口中心值,将该窗口在信号上移动,即为图形学上的卷积操作,其实就是对信号周围区域求了一个平均。
在这里插入图片描述
接着我们再引出一个定理:时域上两个信号的卷积等于频域上两个信号的乘积
在这里插入图片描述
也就是说对一个图片进行卷积操作,可以等同于将该图片与卷积核进行傅里叶变换后进行乘积操作,再逆傅里叶变化回去。有了这个定理后,我们联想之前的操作,这个滤波器的功能也是求平均,放在频域上基本上都是低频信息,相当于一个低通滤波器,这个盒子性状的滤波器被称为Box Filter
在这里插入图片描述
在这里插入图片描述
那假如将这个盒子变大了,由于平均的部分更多了,相当于就是一个更低通的滤波器,图像会变得更加模糊,相反如果盒子变得更小,则会是一个高通滤波器。
在这里插入图片描述

4. 定义

采样其实就是在重复频域上的内容。如图我们有一个原始信号a图,让它与b图的冲激函数相乘(只在一部分位置上有值,其他位置上没值),就可以得到e图。对应到频域上,原始信号的频域为b图,采样信号的频域是d图,冲激函数经过一系列傅里叶变换后还是冲激函数,只是间隔不一样。将b与d卷积,得到的频谱f其实就是将b在频域上不断重复,所以采样就是在重复一个频谱。
在这里插入图片描述
当我们采样率不够快,那我们对原始信号复制粘贴的间隔就会变得非常小,采样的越稀疏得到的信号就会越密集,当过于密集时,得到的信号发生了混叠,这就导致了走样(Aliasing)所以我们对图形像素的采样如果采样的多很密集,得到的信号就会稀疏,如果我们对像素的采样太稀疏,就会导致走样。

图形学中采样的过程由于走样会产生各种瑕疵(Artifact),例如产生锯齿,还有摩尔纹,以及车轮效应等等,前两者是空间上采样导致的,第三个是时间上采样所致,不过所有的Artifact产生的原因都可以总结为一句话:就是信号变化的速度太快,以至于采样的速度都跟不上变化的速度
在这里插入图片描述

三、反走样(Anti-aliasing)

1. 解决方式

有几种方法来解决走样问题:

增加采样率
例如屏幕的分辨率提高,像素变小,那么就相当于采样更密集,采样率提高,但是受限于物理限制,我们在处理屏幕时并不能随心所欲的修改分辨率,所以这个方法只能是一个终极方法。

先做模糊(低通滤波)再采样
如图先把高频信号砍掉,得到一个五边形形状的信号,然后再采样就不会发生混叠了。
在这里插入图片描述
但我们要注意的是,模糊和采样的顺序是固定的,我们只有先进性模糊操作再采样(Blurred Aliasing)才可以解决走样,如果反过来就达不到这样的效果
在这里插入图片描述
因此我们对于三角形的采样,也是先对其进行模糊操作,然后再进行采样
在这里插入图片描述
首先我们需要一个一定大小的低通滤波器对三角形进行卷积,也就是对三角形上所有点的像素,将每个像素内部的点平均起来,然后对每个像素中心采样。
在这里插入图片描述

2. 多重采样抗锯齿(MSAA)

MSAA是一个对反走样的近似,它并不能解决反走样的问题。对于任何一个像素,它将划分为很多小的点,通过判断小点是否在三角形内,来求像素的平均值,从而达到抗锯齿的效果。由于MSAA只是求了每个像素的平均值,而由于平均后每个像素内的值都变成了一样的,所以其实它从某种意义上来说也包含了采样进去。不过注意的是MSAA并没有提高像素的分辨率,只是合理的近似三角形的覆盖率。
在这里插入图片描述
在这里插入图片描述
虽然我们达到了抗锯齿的效果,不过由于我们通过更多的点去测试是否在三角形内,因此增大了计算量,但实际上在工业界中,我们并不是会规矩的在一个像素内取四个规则的点来采样,而是会用一些特殊的图案来分布这些点,甚至有一些还会被邻近的像素所复有,通过这些点来检测三角形的覆盖,这也是为什么打游戏时启用MSAA可能帧率并没掉四分之一。

3. 其他方法

FXAA这个方法与增加样本数没有任何关系,它是先将有锯齿的图得出来,然后把锯齿的边界找到,将这些有锯齿的边界换成没有锯齿的边界,但是注意如果我们先得到一张有锯齿的图然后再进行模糊操作这样是不对的。

TAA这是一种基于着色器的算法,使用运动矢量组合两帧,以确定在何处对前一帧进行采样。在每一帧对屏幕区域内的像素进行一个抖动操作,这样当连续的多个帧的数据混合起来以后,就相当于对每个像素进行了多次采样,他将采样点从单帧分布到多个帧上,使得每一帧并不需要多次采样增加计算量,但TAA往往会盲目地跟随移动物体的运动矢量,从而造成屏幕上的细节模糊不清。

当我们将一张图放大看时,会产生锯齿,那如果我们又想放大又不想看到锯齿,那这就是超分辨率的范围了。其实也可以理解为高分辨率的图为1k x 1k的,但是我们采样得到的图只有512 x 512的,那么想把这个高分辨率的图恢复回来的过程也叫超分辨率,从这个角度来说,超分辨率和MSAA的过程是非常相似的。一般可以通过DLSS(Deep Learning Super Sampling)的方法来解决,将图片拉大后其实有些细节缺失,那可以通过深度学习来将这些细节猜出来来补上去。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值