Games101-光栅化(深度测试与抗锯齿)

采样

在这里插入图片描述
照片:像素在不同位置的光的采样
在这里插入图片描述
采样不仅可以发生在不同的位置,还可以发生不同的时间
动画实际上就是在时间上进行的采样

Sample Artifacts

Artifacts:一切觉得不太对的东西
在这里插入图片描述
锯齿
在这里插入图片描述
摩尔纹
左边这张图的奇数行和奇数列全部去掉,再重新堆在一块,会变成一张小的图。再显示同样的尺寸。
如日常生活中,拿手机去拍显示屏会产生一系列扭曲的纹路
在这里插入图片描述
车轮效应
纸片是顺时针旋转,但有些环看起来像逆时针。
包括显示生活中高速行驶的汽车,有些轮子像在倒转。这些例子都可以用采样来表示
因为人眼在时间上的采样跟不上运动的速度
在这里插入图片描述
前两个都是空间上采样会产生的问题,第三个是时间
本质都是:信号(函数)变化的速度太快,导致采样的速度跟不上

采样前先进行模糊(滤波)/Blurring (Pre-Filtering) Before Sampling

如何做反走样
在这里插入图片描述
有些点完全在三角形内,有些完全在外。要么是白的要么是红的
在这里插入图片描述
把一个三角形先做模糊的操作,然后用像素的中心点去采样,采样的是模糊的三角形。离三角形边界远的偏白,离边界近的偏红。
即对原始的函数(信号)做模糊(滤波),然后采样。进行抗锯齿(反走样)
在这里插入图片描述
走样的图
在这里插入图片描述
反走样的图
在这里插入图片描述
抗锯齿对比图
在这里插入图片描述
先采样再滤波效果是错的
在这里插入图片描述

频域/Frequency Domain

在这里插入图片描述
在这里插入图片描述
通过调整系数会得到不同的余弦波
频率 f等于多少就是频率为多少,第一个余弦函数频率为1,第二个函数频率为2.
定义函数的变化有多快
周期 每隔多少函数会重复进行一次。T = 1/频率
在这里插入图片描述
傅立叶级数展开:任何一个周期函数都可以写成一系列正弦,余弦函数的线性组合以及一个常数项
在这里插入图片描述
傅立叶变换:给定一个函数,可以在经过一个复杂的变换之后,变成另一个函数

不同的正弦余弦函数有不同的频率,即通过傅立叶级数展开,任何一个函数都可以分解成不同的频率(从低到高)
在这里插入图片描述
傅立叶变换其实就是把函数变成不同频率的段,并且我们把不同的段给显示出来
对上图,用完全相同的采样方法,即每间隔一段,对五个函数分别采样。发现越往下,越无法通过采样点恢复原来的函数
对于一个函数,本身有一定的频率,采样也应该有一个频率。如果采样频率高,可以恢复一个频率高的函数。如果函数本身频率高,但采样频率低,则跟不上原始的信号
在这里插入图片描述
走样:用同样的采样频率,采样两个频率完全不同的信号(上图蓝色信号和黑色信号),可能得到一个完全相同的结果,无法区分开

Filtering = Getting rid of certain frequency contents

滤波:从频域的角度说,就是把某个特定的频段给抹除掉,对应的信号会如何发生变换
在这里插入图片描述

傅立叶变换可以把一个函数从时域变成频域。
如上图,对左边的图进行傅立叶变换,虽然图片没有时间信息,但是空间的位置也算是时域
从左边的图像空间变换成右边的频域的空间
右图中心是最低频的区域,周围为高频,在不同频率上有多少信息,通过亮度来表示。对于自然图片而言,多数信息都是在低频
傅立叶变换都是按周期性处理的,对于非周期性图片,例如左边图片的边缘再往外会重复图片(类似平铺的效果)。而很少有图片左边界与右边界是一样的,因此在图片边界处会发生急剧的高频变换,产生右图中两条垂直水平直线的效果。因此分析图内部的时候,会忽略两条直线
频谱:任何信号在不同频率长什么样
在这里插入图片描述
高通滤波:只有高频信息可以通过
滤波把低频信号的信息都抹除后,如上面右图,再进行逆傅立叶变换,变换回左图。
可以看出高频的信息表示了图像的边界/轮廓(在边界的左边和右边发生了很大的变换,可能就是高频的信息/信息变化非常大)
在这里插入图片描述
低通滤波:只让低频信息通过
将高频信息全部抹除,会发现得到一张相对模糊的图
在这里插入图片描述
带通滤波
高频信息和低频信息都去掉了,提取到一些不是很明显的边界特征
在这里插入图片描述
扩大圈时,留下的频率更高频,更像高通滤波的边界

Filtering = Convolution(= Averaging)

滤波又等于卷积
模糊就是一种平均操作
在这里插入图片描述
数组是一个一维的信号,下面的窗口是一个滤波器。
在这里插入图片描述
在这里插入图片描述

卷积:移动窗口的过程中,把窗口的三个数和窗口对应的三个数进行点乘,得到的数值写回窗口的中心值。即对原始信号的任何位置,取周围的若干数进行加权平均。得到一个新的信号
注意:这是图形学上简化的定义,不是真正数学上的定义
在这里插入图片描述

卷积定理: 时域上如果对两个信号进行卷积,实际上就是对应到两个信号各自频域的乘积(可以把图先傅立叶变换,再把滤波器进行傅立叶变换,进行乘积后再做逆傅立叶变换)。时域上的乘积等于频域上的卷积
在这里插入图片描述
对一幅图,进行一个平均/卷积 操作,滤波器是个3x3的窗口,即对任何一个像素取周围的9个数进行平均,写回像素本身
或者如下行图,先傅立叶变换,进行乘积,再逆傅立叶变换(像是进行了低通滤波)
在这里插入图片描述
为了防止卷积后图形变得更亮,要进行归一化操作,即 × \times × 1 9 {1}\over{9} 91
在这里插入图片描述
在这里插入图片描述
核变大了,频域反而变小了
之前为了模糊一张图时,用了3*3的卷积核进行滤波。当用更大的卷积核做卷积盒做操作时,图片会更模糊。如果是一个比图片本身还大的卷积盒,得到的结果是所有像素都一样。
如果是超级小的滤波器,比一个像素还小,等于完全没做滤波。那相当于频域上的范围超级大,把所有的频率都留了下来。

Sampling = Repeating Frequency Contents

从频域的角度来说,采样就是在重复频域上的内容
在这里插入图片描述
图c:冲击函数,只在这个位置有值。冲击函数卷积后,仍是一系列冲击函数
时域:一个原始信号乘上一系例冲击函数,得到采样的结果 (左图)
频域: 原始的函数的频谱进行了复制粘贴,即在重复频域上的内容 (右图)
在这里插入图片描述
走样现象:采样不同的间隔会引起频谱以不同的间隔进行移动,当采样率不足(即采样的不够快,采样的距离很大),会使原始信号频域上频谱复制粘贴中间的间隔不够大。当原始信号和复制粘贴的信号混叠了,就发生走样现象
时域和频域上有很多相反的关系
例如光栅化三角形时,每个像素非常小,像素跟像素的中心间隔小,相当于采样的频率更密集,如果每个像素非常大,相当于用稀疏的采样,产生的走样现象就会非常严重

反走样/Antialiasing

在这里插入图片描述
解决办法:

  1. 增加采样率。如现代显示器增加分辨率。但这不是反走样(反走样是在同一块屏幕做的处理)
  2. 先做模糊,再做采样。先做低通滤波,抹除高频信息,再采样
    在这里插入图片描述
    抹除高频信号后,再复制粘贴,就不会产生混叠
    在这里插入图片描述
    在这里插入图片描述
    模糊:用一定大小的低通滤波器进行卷积
    在这里插入图片描述
    最简单的块就是一个像素,就是一个低通滤波器
    在这里插入图片描述
    原本的三角形要么点在三角形里,要么在三角形外,是个2值的函数,现在要对这个函数做卷积操作,用每一个像素/对应的小的box求平均,然后对像素中心采样
    在这里插入图片描述
    对于任何一个像素,可以看到三角形覆盖的面积,对值求平局,如第一个图覆盖了 1 8 {1}\over{8} 81,则对于像素是 1 8 {1}\over{8} 81的色

Antialiasing By Supersampling(MSAA)

求三角形覆盖的面积不是一件容易的事,实际中用更多的采样点来进行反走样MSAA,是一个对反走样的近似,不是严格意义上解决反走样的问题
在这里插入图片描述
一个像素被划分成了许多个小的像素,如上图划分了16个小像素,判断小像素点在不在三角形内
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
用划分的小像素点,计算像素对应的值。
在这里插入图片描述
通过MSAA进行的是反走样的第一步,模糊,模糊完之后再采样。
注意MSAA解决的是模糊的操作,采样是隐含在下一步的操作,所以MSAA不是提升分辨率解决采样问题,只是为了近似一个合理的覆盖率

在这里插入图片描述

思考

  1. MSAA为了抗锯齿的效果,牺牲了什么:计算量变大
    工业上用的并不是一个像素划分成多个规则的像素点,然后取更小像素的中心。会用一些更加有效的图案来分布这些点,有一些点还会被临近的不同像素所复用
  2. FXAA:一个图像的后期处理和采样无关,先得到一个有锯齿的图像,通过一些图像匹配的方法找到边界,并且把有锯齿的边界换成没有锯齿的边界
  3. TAA:找上一帧的信息,如果是一个静止的场景,可以用相邻两帧一个像素内部不同位置上的点来感知是否在三角形内。相当于MSAA对应的样本给分布在了时间上,在当前帧上并没有引入额外的操作。会出现一会儿有锯齿,一会儿没锯齿
  4. 超分辨率:一张图拉大,也是采样率不足
    DLSS:通过深度学习的办法猜出来

深度缓存

在这里插入图片描述
画家算法:先画远处,再画近处,新画的物体会覆盖掉以前画的物体
在这里插入图片描述
互相遮挡的物体没法按深度排序
在这里插入图片描述
对于空间中的三角形不好排远近的顺序,可以对每个像素的远近进行排序
渲染时,除了渲染出场景的图像,即最后的结果的一张图像(frame buffer),也会生成另一张图像,只存每个像素所看到的几何物体的最浅的深度信息,这张图称为深度缓存(depth buffer)
注意:之前定义摄像机是朝向-z方向,近平面的z值更大,远平面的z值更小。深度缓存里,为了方便理解,记录的z值永远为正,z值越小,越近,z值越大,越远。
在这里插入图片描述
z值越小,深度越近,颜色越黑
在这里插入图片描述
初始默认每个像素的z值是无限远的,对任意三角形覆盖的每个像素,如果新的三角形要画在像素内,对比该像素在新三角形上的深度与深度缓存记录的深度。如果小于,则更新深度缓存上的z值并把新三角形在这个像素画上去,反之略过
在这里插入图片描述
在这里插入图片描述
深度缓存复杂度:每个三角形覆盖常数个像素,对n个三角形,是常数乘以三角形个数,是O(n)的算法。因为这里实际并没有排序,只是在对每个像素求最小值
深度缓存算法和三角形绘制顺序是没有关系的(默认几乎不存在z值相等的三角形,浮点数很难判断相等)
如果运用MSAA,注意不是对每个像素进行zBuffer的记录,而是对每个采样点进行zBuffer的记录

作业

栅格化三角形并通过深度测试
注意一点:右手坐标系下,z值越大,离near越近。为了转化成深度测试时,z值越小,离near越大,需要对作业1的透视矩阵对z轴取反
取反细节和原理
在这里插入图片描述
在这里插入图片描述

SSAA抗锯齿效果
在这里插入图片描述
在这里插入图片描述
github作业地址

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值