画家算法,又称深度排序法。
我们先看看它的算法:
(1)将屏幕设成背景色,
(2)把要画的物体(多边形)按其离开视点的从远到近排序(#add 确定可以排序么?不会有交叉的面?这个距离又是指哪个点到哪个点? 从后文得知,画家算法不适用于交叉的情况,只能针对包围体,此距离也是个最小距离)。由此构成深度优先级表。然后从远到近画物体(多边形),近的就因为优先级高而覆盖远的多边形。由此可消隐。
z缓冲区算法(Z-buffer算法)
先开一个帧缓冲区记录每个像素的亮度值,再开一个Z缓冲区存放每个像素的深度值。那么对于每个像素而言,它有两个参数值,需要定义两个数组。所以,对于每一个像素,由于有了深度这个数组,它在内存中就是立体的了,所以,在内存中整个图像都是立体的。
然后,逐行扫描,就可以测出每一行的深度值了。以此达到消隐的作用。
由此,我们可以看到画家算法和Z-buffer算法1的不同之处。
应该说,它们之间最本质的区别在于:画家算法是按照物体(多边形)的深度进行排序,比较容易实现;而Z-buffer算法是按照图像每一个像素进行排序,比总体排序灵活简单。
立方体画家消隐算法与Z-Buffer消隐算法在别的方面有所类似,在<计算机图形学实践教程VC++ 孔令德>中,两个算法用到的立方体都是正交投影,而不是透视投影,即立方体远离视点时显示的立方体仍然是原大小,不变化.只是二种算法核心思想不同:
一.立方体Z-Buffer消隐是 对于某一个像素点,不必对在靠近或远离视点的面进行排序,只需在遍历各面后找出该像素的深度最大的点(Z最大,即离视点最近)(先找深度大的点setPixel(),如果以后还有深度更大的,则通过设置新的颜色setPixel()来覆盖以前的点,其中要注意以yi为扫描线时,扫描线可能不与屏幕平行,可能是倾斜着的,就像把opengl的X轴绕Y轴旋转一个角度,如向量(1,-1,0),此次每次随x增大,z也会相应变化-A/C,其中(A,B,C)为该面的法向量),可以说它是对逐个像素进行深度判断进行的.主要代码如下:
for(T1=HeadE;T1!=NULL;T1=T1->next)//填充扫描线和多边形相交的区间
{
if(In==false)
{