1.Rasterization光栅化
屏幕由像素点构成,是离散的,二维的。
计算机生成图像中,最基本的二维元素是三角形,对其的离散化操作就是生成图像的重点。
如何离散化(光栅化,Rasterization)?Sampling采样!
一个像素点对应一个坐标点,对这个坐标点采样,判断它在不在三角形里面
判断一个像素与三角形的位置关系。
采样的缺点:以点代面,有失偏颇 → Aliasing 走样,表现为锯齿
1.1采样
采样就是把一个函数给离散化的过程。(没错没有想象的那么复杂)
利用像素中心对像素进行采样:
在这里我们给出一种非常有有趣的方法来判断一个像素点是否在三角形的内部(不考虑像素点在三角形的边上):
我们要利用学过的向量积的知识,一般是按照逆时针的顺序,如图一般为P0,P1,P2,分别与P的地点连接,两两得出向量积,如果三个叉乘的结果相同则说明在三角形内部,否则在外部。
1.2走样
走样,什么是走样?汉语字典给的定义是:变样,失去原有的样子。这个就很好理解了,像上篇文章中,我们光栅化一个三角形,得到的结果因为锯齿导致它变样了(如下图),那么锯齿就是我们走样的一种体现。
反走样:
反走样的思想:在采样前先做模糊处理。
如果先采样再模糊处理,效果不好,这个 名字叫做Blurred Aliasing
2.光栅化
2.1频率
ps:这一块的知识就不讲了。大家应该都会 -。-
2.2傅里叶变换
任何一个函数都可以写出一系列正弦和余弦函数的线性组合以及一个常数项。
下图我们要描述的是像城墙的函数,用一个cos和sin的线性组合来表示这个函数。引入更多的线性组合,就会无限接近。
所以我们知道任何一个函数都可以分解成不同的频率。
傅里叶变换:把一个函数变成不同的频率的段,并且显示出来。
可以看到,采样相同的点,在不同的频率上采样恢复的情况不同。
一个函数本身有一定的频率,采样也有一定的频域。如果间隔很小,采样非常密,采样频率很高,就可以采用很多频率的采样点,恢复出很高频率的函数来。如果函数本身频率很高,但是采样的频率很低,那就跟不上这个变换。
所以采样和频率是非常关键的。
2.3采样
何为采样?
采样就是重复频率内容
冲激函数:只在这个位置上有值,其他位置上没有值。
原始函数a乘以一个冲激函数,就可以得到采样结果。
所以采样就是在频域上将原始信号不断重复。
时域和频域上有很大相反的关系:采样的越稀疏,对于频谱搬移越密集。搬一点太密集了就会有问题。
所谓走样就是在搬移的时候频谱发生了混合。
增加采样率是一种解决方法,但是不现实,我们选择先将高频信号去除,再采样。
实质就是低通滤波,把高频信号过滤,再采样。
如图所示:
反走样的方法:
也就是计算三角形的边覆盖了一个像素的比例,来决定这个像素的亮度和呈现的颜色。
2.4MSAA
Antialiasing By Supersampling (MSAA)
- 近似方法
- Monte-Carlo
- 像素的颜色值为负责的区域内取样多次颜色值的平均。
2.5深度缓存
Painter’s Algorithm:由远及近画画,覆盖
- 深度计算与排序:O(nlogn)
- 可能有无法排序的情况:例如三个三角形互相重叠
Z-buffer:对每个像素多存一个深度
- 实际coding中,(smaller z -> further, larger z -> closer)