openGL 深度测试

  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)将深度缓冲区设置为只读形式,不然可能出现画面错误。为何呢,由于画透明物体时,将使用混色,这时就不能继续使用深度模式,而是利用混色函数来进行混合。这一来,就可使用混合函数绘制半透明物体了。

相关文章
相关标签/搜索