1.深度测试在什么情况下会用到
我们在使用OpenGL绘制出一个甜甜圈样式的立体图形,在旋转时,会出现前后两个部分重叠,此时OpenGL分辨不出哪个图层在前,哪个图层在后,此时就会出现甜甜圈被啃了一口的现象,这时候我们就要使用深度测试来解决。另外深度测试还能用于解决隐藏面消除问题。
2.深度测试的一些概念
深度:在OpenGL的坐标系中,像素点的Z坐标距离观察者的距离。
深度缓冲区:用于存储屏幕上图形的每个像素点的深度值,它存储在显存中。
深度缓存原理:将深度值与图形的每个像素点一一对应并将深度值存储到深度缓冲区中,缓存区的范围是0~1之间的浮点数值,默认深度为1.0,我们在绘制图形之前都会先清空深度缓存区。
深度测试:深度缓冲区跟颜色缓冲区是对应的,深度缓冲区存储像素的深度信息,颜色缓冲区存储像素的颜色信息,在决定是否绘制一个图形的表面时,首先要将表面对应的像素的深度值与当前深度缓冲区中的值进行比较,如果大于深度缓冲区中的值,则丢弃这部分,否则将这个像素点对应的深度值和颜色值更新到对应的缓冲区内,这个过程我们称之为深度测试。深度测试是有规则的,我们可以通过glDepthFunc(GLenum func)这个函数修改他的测试规则。
3.深度测试的风险
Z-fighting:开启深度测试后,由于深度缓冲区的精度限制,对于两个深度值相差非常小的情况下,OpenGL可能无法正确判断谁大谁小,这时绘制出的画面就有可能出现交错显示。
针对Z冲突问题,OpenGL提供“多边形偏移”的方法来解决他。原理就是在产生Z-fighting的图层之间产生一个微妙的间隔,这样就能正确判断深度的大小。通常使用的深度缓冲区是24位的,现在一些硬件使用的是32或64位的缓冲区,精确度大大提高,这也是现在我们很少见到Z-fighting现象的原因。
网友评论