出于测试目的,让我们假设我用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。
为什么会发生这种情况?如何保持其他对象背后的对象不被绘制在前面,或者根本没有?
答案 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