OPenGL之深度测试(depth testing)

    在绘制3D场景的时候,需要确定哪些部分对观察者可见,哪些对观察者不可见。OpenGL使用的是Z-buffer方法,也叫深度缓冲区Depth-buffer。

    深度缓冲区一般由窗口管理系统,例如GLFW来创建,深度值一般由16位,24位或者32位值表示,通常是24位。位数越高的话,深度的精确度越好。深度值的范围在[0,1]之间,值越小表示越靠近观察者,值越大表示远离观察者。 

    默认情况下,深度缓冲是关闭的,使用时需要显示启用,否则绘制出的场景可能会不符合实际。请看下面的例子。

代码示例

glColor3f(0.7f, 1.0f, 0.3f);
glLineWidth(4);
glBegin(GL_LINES);
	glVertex3f(100.0f, 70.0f, 0.0f);
	glVertex3f(40.0f, 70.0f, 0.0f);	
glEnd();

glColor3f(0.7f, 0.0f, 0.0f);
glLineWidth(10);
glBegin(GL_LINES);
	glVertex3f(70.0f, 70.0f, -0.5f);
	glVertex3f(150.0f, 70.0f, -0.5f);
glEnd();

    为了便于观察深度测试的效果,先后绘制两条直线。第一条直线的宽度设为4,颜色设为黄色。第二条直线的宽度设为10,颜色设为红色。红线距离视点的位置较远。

 启用深度测试之前

    绘制结果如图。可以看到,红线距离视点较远,但由于绘制时间晚,仍然遮挡了黄线。显然,这与实际情况不符。


  启用深度测试

glEnable(GL_DEPTH_TEST);

 启用深度测试之后

绘制结果如图,距离视点近的黄线正确的显示,距离视点较远的红线被部分遮挡,这与实际情况符合。


总结 

     深度缓冲区(Detph buffer)同颜色缓冲区(color buffer)是对应的,颜色缓冲区存储的像素的颜色信息,而深度缓冲区存储像素的深度信息。在决定是否绘制一个物体的表面时,首先将表面对应像素的深度值与当前深度缓冲区中的值进行比较,如果大于等于深度缓冲区中值,则丢弃这部分;否则利用这个像素对应的深度值和颜色值,分别更新深度缓冲区和颜色缓冲区。这一过程称之为深度测试(Depth Testing)。

猜你喜欢

转载自blog.csdn.net/liyazhen2011/article/details/80790334