OpenGL中的深度缓存

来源:互联网 发布:java 提取html文本 编辑:程序博客网 时间:2024/04/29 23:52

在说深度缓存前先来了解一下什么是深度?

深度,在日常生活中,这个词可以用来形容比如说一口井有多少深,即是一个距离,在OpenGL中也是一样的,不过它是用z坐标来描述的。一般地,z轴的坐标原点在屏幕上,屏幕里为负轴,向外为正轴。我们通过眼睛可以看井的里面,那么在OpenGL中眼睛描述为摄像机。一般地,摄像机的初始位置在OpenGL窗口的正中心。

说了什么是深度,接下来就来说一下什么是深度缓存(区)?

我们在用OpenGL来绘制图形的时候,我们希望有些图形在前,有些图形在后,这时候就用到了z坐标。当然,并不一定图形1的z坐标大于图形2的z坐标,就说图形1会绘制在图形2的前面,这是不对的,因为,这取决于我们的观察平面,即摄像机的位置。当然,如果我们不改动摄像机的位置(即初始化状态),那就可以这么认为的了。但是,如果z坐标超出到了屏幕的外面,那当然我们是看不到的了。

深度缓存(区)的原理就是把一个距离观察平面的深度值(或距离)与窗口的每个像素相关联。

在绘制之前,先通过glClear(GL_DEPTH_BUFFER_BIT);来清除深度缓存。然后在绘制的时候OpenGL会计算绘制图形与观察平面的距离。如果启用了深度缓存区,那么,在绘制的时候会首先对新的深度值和当前窗口中的深度值进行比较,如果小于,则替换当前像素位置的深度值和像素值。反之,就会被遮挡。

在通过深度缓存来绘制图形时,首先我们需要对深度缓存进行一些初始化。代码如下:

glClearDepth(1.0f); // 设置深度缓存  glEnable(GL_DEPTH_TEST);    // 启用深度测试  glDepthFunc(GL_LEQUAL);     // 深度测试类型  

首先来说一下glClearDepth(1.0f);

该函数的作用是设置深度缓存的清除值,范围是0.0f~1.0f,这里的值表示,绘制的像素的深度值如果小于这个值,则会被画出来,反之就不会。一般地,设置为1.0f,由于物体的像素的深度值范围为0.0f~1.0f,所以,物体就会被全部显示出来。如果设置为0.0f,那就等于不可见了。

再来说一下glEnable(GL_DEPTH_TEST);

这个函数的作用就是启用深度缓存(区)。

最后再说一下glDepthFunc(GL_LEQUAL);

这个函数的作用就是设置深度测试类型,也可以叫做深度缓存比较函数。

在上述中,说到了这句话“新的深度值和当前窗口中的深度值进行比较,如果小于,则替换当前像素位置的深度值和像素值。反之,就会被遮挡。”这个就取决于深度测试的类型。我们来看一下它的一些参数:

GL_NEVER,GL_LESS,GL_EQUAL,GL_LEQUAL,GL_GREATER,GL_NOTEQUAL,GL_GEQUAL,GL_ALWAYS,GL_LESS。

系统默认的参数为GL_LESS,这跟我们现实生活中一样,距离我视线的并且在同一直线上的事物,近的就会遮挡住远的。
GL_NEVER,不通过(输入的深度值不取代参考值)

GL_LESS,如果输入的深度值小于参考值,则通过

GL_EQUAL,如果输入的深度值等于参考值,则通过

GL_LEQUAL,如果输入的深度值小于或等于参考值,则通过

GL_GREATER,如果输入的深度值大于参考值,则通过

GL_NOTEQUAL,如果输入的深度值不等于参考值,则通过

GL_GEQUAL,如果输入的深度值大于或等于参考值,则通过

GL_ALWAYS,总是通过(输入的深度值取代参考值)

一般地,我们都会选择GL_LESS或者GL_LEQUAL,因为这两个更加符合实际,但是在具体应用中,还需要具体情况具体分析。

好了,这次先写到这儿吧~233333


To be continued~



2 0
原创粉丝点击