什么是深度测试?
深度是指该像素点在3D世界中距离摄像机位置的Z值。深度测试就是将距离观察者最近(当观察者在Z轴的正面,z值越大越靠近观察者,当观察者在Z轴的负面,z值越小越靠近观察者)的值和其对应的颜色值(纹理数据)保存起来,最后显示到屏幕上的就是这个值。
为什么要用深度测试?
我们在绘制的时候要判断哪个部分要显示哪个部分要隐藏,即隐藏面消除问题,早期使用油画家算法(先绘制较远的图形,在绘制较近的图像)来解决这一问题。但是其在存在一些缺陷(当几个图像相互叠加的时候油画家算法无法处理绘制)。于是,OpenGL使用深度测试来解决隐藏面消除问题。
如何使用深度测试?//开启
glEnable(GL_DEPTH_TEST);
//glDepthFunc(GL_LESS); //设置比较的参数
//关闭
glDisable(GL_DEPTH_TEST);
//在每次绘制之前情况深度缓冲区
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);// 情况颜色缓冲区和深度缓冲区
那么深度测试是不是完全没有问题呢?
深度测试存在ZFighting等问题,就是我么一在游戏或者大型网页的地方偶尔会看到人物会一闪一闪的(不能正确的判断同一平面的绘制的深度值,导致深入测试结果不可预测,会一闪一闪的显示)。
优化ZFighting问题(使用多边形偏移)
第一,使用精度更高的机器,精度越高越难出现ZFighting
第二,使用多边形偏移开启(三种方式,要对应图形的填充方式点、线、面)
glEnable(GL_POLYGON_OFFSET_POINT); //对应GL_POINT
// glEnable(GL_POLYGON_OFFSET_LINE); //对应GL_LINE
// glEnable(GL_POLYGON_OFFSET_FILL); //对应GL_FILL
//两个参数是指便宜的大小,一般指定两个都为-1,交给系统进行偏移计算。
glPolygonOffet(-1.0, -1.0);
关闭
glDisable(GL_POLYGON_OFFSET_FILL);