为什么openGL glDepthFunc()不起作用?

时间:2013-11-12 23:49:07

标签: opengl buffer depth zbuffer

即时播放openGL,我试图摆脱蓝色标记的三角形。我用它来代码:

glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);
glEnable(GL_CULL_FACE);

是的,我用

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

在我的主循环中。我看过问题可以是投影矩阵。我使用这些值:

ProjectionMatrix = glm::perspective(45.5f, 4.0f / 3.0f, 0.1f, 100.0f);

我试图改变近端和远端值,但它仍然是相同的。我也尝试更改glDepthFunc的参数,但它也没有帮助我。 那么,任何想法?非常感谢

my result

1 个答案:

答案 0 :(得分:7)

这是完全有效的行为,因为您没有使用填充多边形。使用glPolygonMode (...)时,面部剔除仍然会像您期望的那样,但深度测试却没有。

深度测试和写入仅适用于光栅化期间的片段,而不适用于剪切/基元组装期间的基元。简而言之,这意味着未填充的任何地方都不会受到基元深度(例如三角形)的影响。因此,深度测试在此示例中应用的唯一位置是屏幕上两条线重叠的极少数点。

如果您想阻止线框覆盖图为通常不可见的三角形绘制线条,则需要绘制两次:

通过1

  1. 将多边形模式设置为 FILL
  2. 禁用颜色写入:glColorMask (GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE)
  3. 绘制基元
  4. 通过2

    1. 将多边形模式设置为 LINE
    2. 启用颜色写入:glColorMask (GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE)
    3. 绘制基元
    4. 这将起作用,因为第一遍使用填充(实心)基元填充深度缓冲区,但不会写入颜色缓冲区(因此一切都仍然是透明的)。第二个过程在每个基元的边缘绘制线条,如果另一个三角形的内部(未填充区域)覆盖它,这些线条将无法进行深度测试。

      注意:您应该使用包含相等性的深度测试(例如GL_LEQAUL)来使上述行为正常运行。所以不要使用GL_LESS