前言:
不知道大家还记得上篇博客的内容吗?在games101-4的结尾里面我有说过,使用采样的方式进行的光栅化是会出现走样的情况的,也就是所谓的锯齿,这里我们来仔细说明一下。
1、锯齿
大家还记得光栅化的实现过程吗?这里粘贴一下本小白的上篇博客小白计算机图形学入门之路一(Games101-4)-CSDN博客
那么在采样后离散得到的三角形的像素点实际上是这个样子的
这个是放大以后的三角形,当然看起来根本就不像一个三角形了,周围就是所谓的锯齿,而这就是所谓的走样,实际上在unity中将一个图片放大都是会出现的,那么,本次笔记呢就是为大家解释一下,锯齿是怎么出现的,并且怎么才可以做到防止走样呢?
2、走样出现的原因
首先我们得明确一点,实际上的光栅化就是进行离散,而采样实际上就是通过函数进行离散操作。
那么重点来了,大家还记得傅里叶公式吗?
任何函数都可以装换为很多正弦和余弦函数的和,也就是任何函数都可以转换为带有频率的函数的形式。!!!!!采样和频率有关吗?别急,待本小白细细说来。
我们进行采样也就是离散成像素的时候实际上是有频率的。也就是说算成值是有固定频率的,而信息的输入(这里特指信号的输入)也是有对应的频率的,这里我们说成信号的输入频率。
那么大家是不是想到了?没错,当信号的输入频率和采样频率对应不上的时候,就会出现走样的情况。
我们着重看一下对比,当频率越来越高,而采样频率不变的时候,是不是对应的F(x)的值不一样了呢?此时就会发生所谓的走样。
走样在频率的角度上来说就是频谱发生了混叠,点和点隔得远,会发生锯齿也就是走样。(这里需要注意的是,将采样过程换到频谱实际上就是重复画一个形状。)
3、避免反走样
首先本小白先说明:避免反走样这里介绍一下unity中带有的反走样(也就是所谓的抗锯齿技术。着重介绍MSAA来说明,在课程中有介绍到先模糊,后采样,实际上也可以通过频谱进行分析。)
Unity重带有的抗锯齿技术有:多重采样抗锯齿(MSAA)、快速近似抗锯齿(FXAA)和子像素抗锯齿(SMAA) 。
这里介绍以下MSAA:
我们上述已经讨论了,锯齿出现的原因实际上就是采样频率和信号输入对不上导致频谱重叠而造成的,那么他们的关系是什么呢?
当采样频率越低,频谱对应的距离就越近。
而MSAA就是将一个像素点拆分为好几个更小的像素点。
就像这样,那么,一个拆分以后的像素点如果其中一个点在三角形内,其余三个点不在的话,那么这个三角形到底着色呢还是不着色呢?答案是着,而且着色的概览就是百分之二十五,也就是四分之一。
那么从频率的角度出发呢?增加了采样频率(分辨率)。但是是不是导致他的频谱的距离更远呢?
本小白就这个问题也陷入过沉思,不过就是我括号内的一样,在unity内当我使用msaa技术的时候不可能进行动态修改分辨率的,那么唯一的可能就是我们去掉了高频部分(高频可以理解为边界),即对三角形进行了模糊处理,效果图如下所示。
那么这就是所谓的MSAA。因此注意的是,并没有提高分辨率,二十去掉了高频部分
当然,很大程度上避免锯齿也会有对应的缺点,就是提升了计算量,那么有没有对应的优化呢?
当然有,就是所谓的FXAA,这里本小白只简单提一下,因为本小白主要进行的是unity的开发部分,这一部分我更多的是当作了解。
FXAA(快速近似抗锯齿),图像的后期处理,先得到有锯齿的图,找到边界,替换边界。
补充
超分辨率:高分辨率图,但是采样频率不够,出现锯齿,DLSS(深度学习来做超采样问题)。
总结
本次课程对于本小白来说更多的是了解,课程中有详细介绍具体的模糊操作是怎么通过卷积公式实现的:Lecture 06 Rasterization 2 (Antialiasing and Z-Buffering)_哔哩哔哩_bilibili,贴心为各位大佬奉上我上b站看的课程链接,当然,也希望多多支持本小白的课程笔记,本小白励志想成为的编辑器工具开发或者是重构编辑器的部分,也就是搭建框架的工作,如果后续有必要,本小白也会再进行深入的学习,也会为各位分享更多的关于unity学习的进阶笔记。
ps:本小白最近在毕业答辩,所有有时会更新比较慢,希望各位大佬们多多见谅,本小白感激不尽。