消隐算法和前几节内容总结
1.消隐算法1.1画家算法(Painter’s Algorithm)1.2 Z-Buffer算法2.前几节内容总结1.消隐算法
1.1画家算法(Painter’s Algorithm)
把要呈现的图像按照从远到近的顺序,将各层图绘制出来,近的就因为优先级高而覆盖远的多边形。由此可消隐。
先画远处的山,再画较近的草地,草地会覆盖掉一部分山,最后画最近的树木,树木会覆盖掉一部分草地和山。
在图形学中:先光栅化场景里远处的东西,将其呈现在屏幕上,然后再逐级将近处的东西光栅化在屏幕上,若新光栅化的与已经光栅化的物体若产生重叠,则新光栅化的会覆盖住已经光栅化的。
但是画家算法存在在很大的弊端,例如下图所示:
对于这三个三角形,无法判断出他们的深度关系,这是画家算法就不再适用了。
1.2 Z-Buffer算法
先将Z缓冲器中各单元的初始值置为最小值,当要改变某个象素的颜色值时,首先检查当前多边形的深度值是否大于该象素原来的深度值(保存在该象素所对应的Z缓冲器的单元中),如果大于原来的Z值,说明当前多边形更靠近观察点,用它的颜色替换原象素的颜色。
注:
相机是放在坐标原点指向 -z 轴(屏幕里面的),我们看到的z都是负的,因此
直接取Z的绝对值作为物体的深度
如上图,左图为最终渲染效果,右图为Depth / Z-buffer,用来存储每个像素点的深度值(z)。
在Z-Buffer图上,一个像素的深度值越大,距离摄像机就越远,颜色就越白;反之,一个像素的深度值越小,距离摄像机就越近,颜色就越黑。例如:RGB(0,0,0) = 黑
具体计算过程:
Step1:先把所有像素的深度值都初始化为无限大
Step2:前两个for循环:遍历任意一个三角形覆盖的任意一个像素,
Step3:如果这个深度小于之前深度缓存记录好的此像素的深度,则就替换为这个小深度。否则什么不改变深度值。
例如下图所示:
对于n个三角形而言,其时间复杂度为O(n)
其时间复杂度 = 三角形的个数 × 每个三角形覆盖的像素的数
注:
Z-BUFFER只记录所绘制图形的深度,和绘图的顺序没有关系Z-Buffer处理不了透明物体;深度相同用(Z-fighting)解决。
至此,光珊化部分学习结束。
2.前几节内容总结
先对摄像机进行变换,移动摄像机位置到原点,并且朝向-Z方向,这一步是改变了所有物体的位置,使它们的相对位置不变。(左上到右上)然后在相机的角度,对物体进行投影到屏幕上(坐下)最后进行光栅化,将物体绘制在屏幕上(右下)然后我们就可以得到这样一张图:
接着我们要对其进行着色(Shading)。
可见进行着色操作之后显得更加真实。