如何运用OpenGL的深度测试?
深度测试相信大家都用过: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呢?
[解决办法]
你没有理解深度测试到底是什么意思:
比如我现在建一个透视: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();
问一下,你是不是看见了一个矩形,下侧是绿色,上侧是红色的呢?
好好体会下吧。
[解决办法]
OpenGL中深度的范围是在(0,1)之间非线性变化的,越往远处,深度变化率越小。深度与距离的变化曲线就有点像这个图片
因此是无法计算出某个空间点对应的准确的深度值。
glClearDepth设定的深度值是指在清空深度缓存时,用哪一个值去填充这个深度缓存。
glDepthFunc则是指定在进行深度测试的时候,应该采取什么样的规则来将要填入的像素深度值与当前深度缓存中的值进行比较。