目录
上节课的回顾
MVP 完成之后,会得到-1到1的立方体......
透视投影的两个属性
- 长宽比
- 垂直可视角度forvY (水平可视角度)
定义一个视锥,只需定义一个垂直可视角度和一个宽高比,就可以得出远近、左右、上下。
光栅化
概念:将立方体画在屏幕上
屏幕:可描述为二维数组,每个元素都是一个像素。
像素:可表示灰度,划分为256个等级,0表示黑,255表示白。
像素坐标:如图中蓝色像素坐标为(2,1)【左下角】
像素中心:(2.5,1.5)(x+0.5,y+0.5)
视口变换
从(-1,1)的正方形变到屏幕空间。
(忽略z轴)
- 先进行缩放
- 再将左下角移到原点
光栅化
将屏幕空间的多边形进一步打碎,打碎成像素,看每一个像素的值是什么。
看每一个像素是否在三角形内......
采样Sampling
---(光栅化的最简单的方法)将一个函数离散化的过程......
这里是利用像素中心对屏幕空间进行采样。
如何定义inside函数(即如何判断一个点是否在三角形内)?
通过向量的叉乘
Q同时在三条边的左侧或者右侧 则Q在三角形内部。
如果有一个点在三角形的边上呢? ---自己定义一个标准,不做特殊要求。
优化:
1. 定义包围盒
for(x=xmin;x<xmax;++x)
for(y=ymin;y<ymax;++y){ }
2. 每一行找一个最左、最右,就是每一行都定义一个包围盒。
- 操作复杂
- 适用情况:窄长的三角形....
反走样(抗锯齿)
采样结束的结果:
产生了锯齿.......(走样)
如何反走样(抗锯齿)?
-
Artifacts
采样的三种Artifacts:
锯齿 摩尔纹(空间上采样带来的问题) 车轮效应(时间上采样带来的问题)
本质:信号的变化太快导致采样跟不上,所以产生了走样。
反走样的做法:
>>> 先模糊(滤波)再采样
先采样再滤波行吗?
>>>不行,因为已经发生了走样。
-
频域
傅里叶变换:把函数变成不同频率的段,并且把不同频率的段显示出来......
相同的采样方法,采样不同频率的函数。如采样f5的时候,采样频率太低,跟不上函数的变化。
>>>上图中,这些采样点采样黑色函数和蓝色函数得到的结果相同。
同样的采样方法,采样两种频率的函数,得到的结果我们无法区分,这就叫走样。
-
滤波
去掉一系列的频率......
傅里叶变换:可以把一个函数从时域变到频域。
时域 频域
右图中,中间部分为低频,周围部分为高频。(可以看出,低频信息较多)
高通滤波(去掉低频信号) ---对应 图像的边界
>>>图像边界(发生变化较大--对应高频信息)
低通滤波(模糊)(去掉高频信号) ---对应 一幅模糊的图像
带通滤波(去掉低频与高频信号) ---留下了不太明显的边界信息
-
卷积
>>>信号在任何一个地方,在它周围的区域,做了一个平均。
时域上的卷积==频域上的乘积
卷积方法:(相当于做了一个低通滤波)
1). 一个图,用某一个卷积的滤波器,做一个卷积操作。
2). 把这个图先傅里叶变换变到频域上,卷积的滤波器变到频域上,把两者相乘,乘完后得到频域的结果,再进行逆傅里叶变换变到时域上。
时域上的一个卷积核 变到频域上(卷积核越大 频域越小)
-
频域上的采样
采样不够快 >>> 采样点之间的距离很大 >>> 频谱上间隔越小 >>> 产生信号重叠(走样)
>>> 走样:频率的频谱发生了混叠。
结论 :(采样的密集 >>> 走样情况会好很多)
反走样的做法
- 增加采样率。
- 先模糊再采样。(把一个信号的高频信息拿掉,再进行采样。)
模糊:低通滤波
怎么做模糊 ?
用什么样的滤波器进行模糊操作?选用1个像素大小的低通滤波器。
>>>(即对一个像素内的颜色进行平均)
MSAA(近似模糊过程)
MSAA所做的不是提高了采样率和分辨率,而只是为了得到三角形的近似覆盖。
将一个像素划分成四个小的像素。
再进行采样......
MSAA缺点:增加了计算量。
其他抗锯齿方法
- FXAA(快速近似抗锯齿)
>>> 图像的后期处理(**和采样无关**)
先把有锯齿的图像得出来 通过图像匹配找到边界,把边界换成没有锯齿的边界。
- TAA
>>> 复用上一帧感知到的结果,相当于把MSAA的样本分布到时间上,然后不对当前这一帧引入额外的操作。
深度缓冲(Z-buffer)
有很多三角形叠在一起时,他们之间互相遮挡,怎么解决。
画家算法
>>>(先把远处的画出来,再用近的覆盖远处物体......)
需要对每个三角形排序 o(nlogn)
由于存在这样的情况
画家算法并不适用,引入了深度缓存的概念......
深度缓存(Z-buffer)
>>> 看每一个像素记录最浅深度
不需要排序 o(n) n为三角形数量
- 初始化所有像素的距离为无限远。
- 遍历所有三角形中的所有像素。比较之前记录好的深度,若小于之前记录的,更新此深度。
举例:
如果做MSAA,则要对每一个采样点进行Z-buffer,而不是一个像素。