OpenGL 深度测试使用

来源:互联网 发布:c语言repeat是什么意思 编辑:程序博客网 时间:2024/05/29 18:52

第一,什么是openGL的深度 

所谓深度,就是在openGL坐标系中,像素点Z坐标距离摄像机的距离。
摄像机可能放在坐标系的任何位置,那么,就不能简单的说Z数值越大或越小,就是越靠近摄像机。
openGL 会专门用一个缓冲区来存放这个Z坐标数值。就叫深度缓冲区。

第二,深度缓冲区的作用 

一般情况下,我们绘制图片,后绘制的会覆盖前面的。所以,一般我们绘制顺序是先后面在前面。
这就会有一个性能问题,就是遮盖的部分,先绘制的被覆盖是没有意义的运算操作。
深度缓冲区就是来解决这个问题的。
有了深度缓冲区,绘制的时候就会检查Z坐标的数值,靠近摄像机的覆盖远离的,而不是依靠绘制顺序。
这点在3D绘图中,尤其重要。

第三,如何使用缓冲区测试 

为什么要叫测试,是因为开启后,想测试深度值在绘制。

[cpp] view plain copy
  1. glEnable(GL_DEPTH_TEST);  

这句就会开启深度测试。默认情况是Z值小的情况下会覆盖原有的。

如果摄影机,在Z轴的正方向,那么Z值大靠近摄影机。
如果摄影机,在Z轴的负方向,那么Z值小靠近摄影机。

通常,我们希望靠近摄影机的数值覆盖远的。所以,深度测试覆盖规则需要能够修改。

[cpp] view plain copy
  1. glDepthFunc(func);  


这就是修改比较规则的设置。我们能够根据摄影机的位置,决定Z值的覆盖方式。

其中参数func的值可以为GL_NEVER(没有处理)
GL_ALWAYS(处理所有)
GL_LESS(小于)
GL_LEQUAL(小于等于)
GL_EQUAL(等于)
GL_GEQUAL(大于等于)
GL_GREATER(大于)
GL_NOTEQUAL(不等于)
其中默认值是GL_LESS


最后, 有一种情况,用深度测试会有些力不从心。
那就是图片有透明度的时候。因为深度测试只会单纯的覆盖保留不能混色。
这样,在绘制半透明物体后,缓冲区存放了一些半透明物体的数据。那么半透明后面的物体将会不能出现。
可是半透明应该能半透的啊 !!!

这时候,我们可以使用函数 glDepthMask(GL_FALSE) 把深度缓冲区置为只读形式。
这样半透明物体的数值就不能进入缓冲区了。后面绘制的物体只要比原缓冲区数值更靠近摄像机就行了。

所以,最后的绘制顺序是,先绘制所有的不透明物体,以后禁用缓冲区写入,绘制所有半透明的。

原创粉丝点击