4

我正在玩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 的参数,但它也没有帮助我。那么,有什么想法吗??非常感谢

我的结果

4

1 回答 1

7

这是完全有效的行为,因为您没有使用填充多边形。面剔除仍然按照您使用 时的预期方式运行glPolygonMode (...),但深度测试不会。

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

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

通过 1

  1. 将多边形模式设置为填充
  2. 禁用颜色写道:glColorMask (GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE)
  3. 绘制图元

通过 2

  1. 将多边形模式设置为LINE
  2. 启用颜色写入:glColorMask (GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE)
  3. 绘制图元

这将起作用,因为第一遍使用填充(实心)图元填充深度缓冲区,但不写入颜色缓冲区(因此一切仍然是透明的)。第二遍在每个图元的边缘绘制线条,如果另一个三角形的内部(未填充区域)覆盖它,这些线条将无法通过深度测试。

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

于 2013-11-13T00:56:47.323 回答