如何运用OpenGL的深度测试?

Kitchen020 2011-04-20 08:56:14
深度测试相信大家都用过:glEnable(GL_DEPTH_TEST),就可以开启OpenGL的深度测试。

然后设置glClearDepth(maxDepth)设定最大的深度值,范围是[0, 1.0],默认是1.0(也就是说大于它的,就会不被画出)

然后使用glClear(GL_DEPTH_BUFFER_BIT)清除深度缓冲区

最后可以指定glDepthFunc(GL_LESS)等来测试

我现在的问题就是,怎样根据我想要的最大深度值去设定maxDepth呢?

如:
glBegin(GL_POINTS);
glColor3f(1.0, 0.0, 0.0); // red point
glVertex3f(0.0, 0.0, 0.0);
glColor3f(0.0, 1.0, 0.0); // green point
glVertex3f(1.0, 0.0, 6.0);
glEnd();

现在就是想设定一个深度值,使green point不显示出来,请问应该怎样设定maxDepth呢?

...全文
743 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
the_venus 2011-08-04
  • 打赏
  • 举报
回复
其实你可以这么做,看下面的代码:
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);
glColorMask(GL_FALSE,GL_FALSE,GL_FALSE,GL_FALSE);//把颜色缓冲区置为只读,所以这个矩形是不会显示出来的
//在深度为50处画一个非常大的矩形
glTranslatef(0.0f,0.0f,-50.0f);
glRecti(-1000,-1000,10000,10000);//画一个非常大的矩形
glColorMask(GL_TRUE,GL_TRUE,GL_TRUE,GL_TRUE);//让颜色缓冲区变得可写
//再画你所想要的物体就可以了
好好体会吧。。。。
jamesclarke 2011-05-02
  • 打赏
  • 举报
回复
OpenGL中深度的范围是在(0,1)之间非线性变化的,越往远处,深度变化率越小。深度与距离的变化曲线就有点像这个图片

因此是无法计算出某个空间点对应的准确的深度值。

glClearDepth设定的深度值是指在清空深度缓存时,用哪一个值去填充这个深度缓存。

glDepthFunc则是指定在进行深度测试的时候,应该采取什么样的规则来将要填入的像素深度值与当前深度缓存中的值进行比较。

ryfdizuo 2011-04-28
  • 打赏
  • 举报
回复
红皮书上有讲的。
Kitchen020 2011-04-24
  • 打赏
  • 举报
回复
十分感谢the_venus的回答

你说的情况我能够明白

但我是想知道怎样让某些物体无法通过深度测试。

你上面的代码都是在[0.1, 100]的视体里面,当然是都能够看到的

我现在是想要,如:我想物体B的一部分在[50, 100]景深内不绘制出来,然后让物体B在[0.1, 100]这个景深里全部都显示

我现在就是不知道要怎样设置glClearDepth(maxDepth)的参数

或者你能够详细一点说明一下吗?
the_venus 2011-04-22
  • 打赏
  • 举报
回复
你没有理解深度测试到底是什么意思:
比如我现在建一个透视:gluPerspective(60.0,(GLfloat)width/(GLfloat)height,0.1,100);
那么坐标是什么样呢,z轴正方向对着我们,负方向为屏幕里面。

先开启深度测试:
glEnable(GL_DEPTH_TEST);
缺省的情况是glDepthFunc(GL_LESS),也就是说尝试小的能通过对吧!
我现在画图:
glTranslatef(0.0f,0.0f,-50.0f);//先移一下,否则看不见的,因为图形不在视见区,不用多说了,你懂的
glColor3f(1.0f,0.0f,0.0f);//红色
glBegin(GL_QUADS);
glVertex3f(-10.0,-10.0,-10.0);
glVertex3f(10.0,-10.0,-10.0);
glVertex3f(10.0,10.0,10.0);
glVertex3f(-10.0,10.0,10.0);
glEnd();

glColor3f(0.0f,1.0f,0.0f);//绿色
glBegin(GL_QUADS);
glVertex3f(-10.0,-10.0,10.0);
glVertex3f(10.0,-10.0,10.0);
glVertex3f(10.0,10.0,-10.0);
glVertex3f(-10.0,10.0,-10.0);
glEnd();

问一下,你是不是看见了一个矩形,下侧是绿色,上侧是红色的呢?
好好体会下吧。
Kitchen020 2011-04-20
  • 打赏
  • 举报
回复
up,没有人知道吗?!!?!??

4,446

社区成员

发帖
与我相关
我的任务
社区描述
图形图像/机器视觉
社区管理员
  • 机器视觉
  • 迪菲赫尔曼
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧