定义观看模型的基本特性,一些其他因素也会影响图像的创建和显示。下面来看一下隐藏面和双缓冲区技术。
隐藏面
世界上大多数东西是不透明的,所以我们只能看到最近的物体。然而对计算机产生图像来说却是个挑战,因为图形系统是按照人们指定的顺序来绘制物体。为了创建一幅“显示最近的物体”的图像,需要使用看到场景一些合适的工具。
在图像系统中可以使用场景中几何的深度信息来决定哪些物体是离的最近的,并且只绘制物体的前面部分,这个技术叫做深度缓冲。如果深度信息是基于场景中的z坐标,那么也称为z缓冲。在深度缓冲中每个像素都有一个值,他的尺寸和窗口是一样大的,并且它的颜色值是和已经测试的点中离的最近的颜色是一样的。深度值是通过对场景中物体的z值或者眼坐标中国视点到场景中点的距离计算得到的。它的值是经过视图变换后的值,每个顶点的Z值在投影变换中被保留。
当在几何流水线中处理多边形的时候,要保存深度值。在渲染多边形的时候,需要对每个顶点的深度值进行插值来得到每个像素的深度。对计算机来说,处理整数比较要比浮点数比较速度快,所以深度值一般保存为无符号整数,并且分布在视域体的近平面和远平面之间。最大正整数值表示远平面。当浮点深度值转换为整数的时候,会引起锯齿现象。它会导致视点相同的物体深度值不同。解决这个问题的办法是使近平面和远平面在包含显示物体的空间里尽可能得接近,里一个办法使避免在建模的时候使两个物体共面,这使得每一个整数深度单位表示更小的实数,使得连个实数表示同一个深度的可能性更小。
如果直接把z值直接从三维眼空间转化为深度值,值的分布空间并不是线性的。如果近距离和远距离的差别很大,那么z插值过程中的非线性会引起z缓冲的分布偏向近距离的物体,远处的物体更容易产生锯齿现象。使用w-bufffer的缓存即用1/z代替z存储,因为1/z插值更线性,对远距离物体效果更好。还可以使用画家算法来保证只显示场景中确实要显示的部分。
双缓存
缓存时用来存储计算结果的一块内存,在图形屏幕上用来存储像素值。如果只用一块缓存,那么它就是颜色缓存。当产生图像的时候,需要逐个像素的写入缓存。大部分图像API允许使用两个图像缓存来保存计算的结果,它们称为前缓存和后缓存。因为创建一幅图像需要一些时间,而显示一帧图像的速度很快。如果只用一个缓存时不足够,除非只需要创建一幅图像。大部分时候是把图像画到后缓存中,而不是前缓存中,当图像创建完成,把两个缓存进行交换,这样后缓存就变成了前缓存,就可以显示新的图像。这样能够让用户比较满意,如果使用单缓存,在切换图像的时候可能会存在闪烁感。