启用(GL_DEPTH_TEST) - 没有渲染任何内容

19

在OpenGL中,我展示了一个简单的模型。当我启用深度缓冲区时,

glEnable(GL_CULL_FACE);
glEnable(GL_DEPTH_TEST);
glDepthMask(GL_TRUE);

一切都消失了。我读过这篇OpenGL常见问题解答,但没能帮到我。

我的视角设置是:angle=45degnear=1far=40,我把模型放在(0,0,0),并将我的视点放在(0,0,4)。如果没有Z缓冲,我可以看到模型。

有什么可能出了问题?


3
也许你的模型被渲染在了错误的面上?尝试禁用GL_CULL_FACE。仅凭这些代码无法确定问题所在。 - Dave Halter
不,没有帮助。你说的“错误面”是什么意思?法线的方向相反吗?我从文件中加载了一个标准模型。我不确定渲染的顺序,但这是z-buffer的工作,对吧? - Jakub M.
3
法线不影响裁剪。面的裁剪取决于屏幕上顶点出现的方向。它是完全可配置的,但默认情况下,会剔除按顺时针顺序在屏幕上绘制的面的顶点。 - datenwolf
2
-1:因为没有包含更完整的代码,从而迫使人们去“猜测”答案。 - Nicol Bolas
如果启用了GL_CULL_FACE,那么可能是您的顶点的“绕序”有问题;并且您必须清除GL_COLOR_BUFFERT_BIT | GL_DEPTH_BUFFER_BIT)... - Francis Cugler
3个回答

58

你是否确保清除了深度缓冲区?

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
                              ^^^^^^^^^^^^^^^^^^^

谢谢,这对我也有用。我把它放在了渲染代码中,只是没有在调整大小时使用。 - Mmarss
不要犯将上述的#define与GL_DEPTH_BITS混淆的错误……这样做行不通,会让你无法渲染,非常不爽! - electromaggot
那么,这基本上是在说“清除颜色缓冲区和深度缓冲区”吗? - Jared Beck
@JaredBeck:是的,每个比特选择一个受清除操作影响的缓冲层。 - datenwolf
2
如果上述方法不起作用,请检查 gluPerspective、glFrustum 或 glOrtho 函数中的近平面。如果深度缓冲区设置为0,则似乎无法工作。 - user886079

6
如果其他答案无效,请尝试user886079评论中提到的方法。

如果上述方法无效,请检查gluPerspective、glFrustum或glOrtho函数中的近平面。如果将其设置为0,深度缓冲似乎无法工作。

我已经尝试了几乎所有的方法,但无法解决重叠问题。我将近平面值从0.0f更改为0.01f,现在的结果正如所需。


1
如果上述答案不起作用,请尝试以下方法:
  • 如果启用了GL_CULL_FACE,请检查模型顶点的绕序,是(LH)还是(RH)
  • 如果启用了GL_DEPTH_TEST,则检查视锥体与模型视图投影矩阵以及相机位置和视角方向的平面。
  • 如果启用了GL_BLEND,请检查对象在z-buffer中的渲染顺序。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接