在OpenGL中的前景对象前面绘制背景对象?

时间:2011-03-16 19:26:46

标签: opengl drawing z-index glut

出于测试目的,让我们假设我用glutSolidTeapot()绘制了2个茶壶,如下所示:

glColor3f(1.0f, 0.0f, 0.0f); // Red teapot
glutWireTeapot(1.0f);

glColor3f(0.0f, 1.0f, 0.0f); // Green teapot
glTranslatef(0.0f, 0.0f, 3.0f);
glutWireTeapot(1.0f);

相机最初位于(x,y,z) = (0.0f, 0.0f, 5.0f),我正在查看z = -1(这是相机位置#1)。我相信你明白绿色茶壶是最接近相机的物体,红色茶壶就在后面。问题是红色的那个被画成绿色的那个,看起来不正确:

示例:http://i.stack.imgur.com/8WoEn.png

现在,如果我移动相机(x,y,z) = (0.0f, 0.0f, -5.0f)并查看z = 1(这是相机位置#2),我会看到绿色前面的红色茶壶,这是正常的行为。红色现在是距离相机最近的物体,绿色物体位于红色物体后面。一切都很好。

示例:http://i.stack.imgur.com/eJvPE.png

我知道这与订单有关,如果我切换上面的代码(绿色茶壶代码优先),它将解决相机位置#1中的问题,但问题现在可以在相机位置看到#2。

为什么会发生这种情况?如何保持其他对象背后的对象不被绘制在前面,或者根本没有?

2 个答案:

答案 0 :(得分:7)

您需要分配一个深度缓冲区(您最有可能已经这样做了),然后使用glEnable(GL_DEPTH_TEST)

这种情况正在发生,因为没有深度测试,OpenGL根本不会对相机的不同深度做出反应。当您启用深度测试时,GL将拒绝远离当前最近的所有新像素/片段。

如果您想在场景中移动,可能需要通过将GL_DEPTH_BUFFER_BIT添加到glClear来清除深度,否则它会记住距离上一帧最近的片段。

除此之外,您的透视矩阵可能格式不正确。这是特别可能的,因为红色的茶壶被绘制在绿色的茶壶前面,而你绘制它们使得绿色的茶壶会用正确的深度缓冲来覆盖红色茶壶。因此,深度值本身可能很糟糕。

答案 1 :(得分:3)

可能你没有启用Depth Buffer aka z-buffer。 要在初始化部分执行此操作,请添加类似

的内容
glClearDepth(1.0f);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);

在渲染每一帧之前,你必须使用

清除这个缓冲区
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

您可以查看OpenGL Nehe教程以获取更多信息http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=01