openGL里常出现深度测试,一直不清楚。今天就来弄清楚。缓存
(1)什么是深度?函数
深度其实就是该象素点在3d世界中距离摄象机的距离(绘制坐标),深度缓存中存储着每一个象素点(绘制在屏幕上的)的深度值!测试
深度值(Z值)越大,则离摄像机越远。spa
深度值是存贮在深度缓存里面的,咱们用深度缓存的位数来衡量深度缓存的精度。深度缓存位数越高,则精确度越高,目前的显卡通常均可支持16位的Z Buffer,一些高级的显卡已经能够支持32位的Z Buffer,但通常用24位Z Buffer就已经足够了。3d
(2)为何须要深度?orm
在不使用深度测试的时候,若是咱们先绘制一个距离较近的物体,再绘制距离较远的物体,则距离远的物体由于后绘制,会把距离近的物体覆盖掉,这样的效果并非咱们所但愿的。而有了深度缓冲之后,绘制物体的顺序就不那么重要了,都能按照远近(Z值)正常显示,这很关键。it
实际上,只要存在深度缓冲区,不管是否启用深度测试,OpenGL在像素被绘制时都会尝试将深度数据写入到缓冲区内,除非调用了glDepthMask(GL_FALSE)来禁止写入。这些深度数据除了用于常规的测试外,还能够有一些有趣的用途,好比绘制阴影等等。
im
(2)启用深度测试数据
使用 glEnable(GL_DEPTH_TEST);margin
在默认状况是将须要绘制的新像素的z值与深度缓冲区中对应位置的z值进行比较,若是比深度缓存中的值小,那么用新像素的颜色值更新帧缓存中对应像素的颜色值。
可是可使用glDepthFunc(func)来对这种默认测试方式进行修改。
其中参数func的值能够为GL_NEVER(没有处理)、GL_ALWAYS(处理全部)、GL_LESS(小于)、GL_LEQUAL(小于等于)、GL_EQUAL(等于)、GL_GEQUAL(大于等于)、GL_GREATER(大于)或GL_NOTEQUAL(不等于),其中默认值是GL_LESS。
通常来将,使用glDepthFunc(GL_LEQUAL);来表达通常物体之间的遮挡关系。
(3)启用了深度测试,那么这就不适用于同时绘制不透明物体。
备注:
绘制半透明物体时,需注意:在绘制半透明物体时前,还须要利用glDepthMask(GL_FALSE)将深度缓冲区设置为只读形式,不然可能出现画面错误。为何呢,由于画透明物体时,将使用混色,这时就不能继续使用深度模式,而是利用混色函数来进行混合。这一来,就可使用混合函数绘制半透明物体了。